为了干燥我的单元测试,我尝试使用 AutoFixture 作为 IoC 容器来实例化我的被测系统 (SUT),在本例中是 ASP.NET MVCController
s。因此,我想自定义 AutoFixture 以创建没有自动属性的控制器。
我尝试添加自定义ControllerBase
,但它似乎不适用于子类ControllerBase
.
fixture.Customize<ControllerBase>(c => c.OmitAutoProperties());
这是我希望能够编写的测试的示例:
[Theory, AutoFixtureData]
public void ControllerTest(AccountController controller) {
Assert.Equal(default(UrlHelper), controller.Url);
}
当然,如果我为项目中的每个特定控制器手动添加一个自定义,它就会起作用,但谁愿意这样做呢?有没有更好的办法?
以下定制通过了上述测试,并按照您的要求进行
public class MvcCostumization : ICustomization
{
public void Customize(IFixture fixture)
{
fixture.Customizations.Add(
new FilteringSpecimenBuilder(
new MethodInvoker(new ModestConstructorQuery()),
new ControllerSpecification()));
}
private class ControllerSpecification : IRequestSpecification
{
public bool IsSatisfiedBy(object request)
{
var t = request as Type;
if (t == null)
return false;
return typeof(ControllerBase).IsAssignableFrom(t);
}
}
}
但是,这会禁用all所有 MVC 控制器的属性,包括User
, HttpContext
, ModelState
, Request
, Response
等等。您可能在单元测试中需要这些,所以您确定要这样做吗?
我将是第一个同意 MVC 的人Controller
基类是一个巨大的 SRP 违规,但它是一个给我们的类,所以除了尽力充分利用它之外,我们无能为力。
通常,你只需要稍微扭动它,就能让 AutoFixture 自动填充大部分属性。
在 MVC 3 项目中,这与AutoMoq 扩展 http://blog.ploeh.dk/2010/08/19/AutoFixtureAsAnAutomockingContainer.aspx,足以创建控制器实例:
fixture.Customize<ModelBindingContext>(c => c
.Without(x => x.Model)
.Without(x => x.ModelType));
fixture.Inject(CultureInfo.CurrentCulture);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)