试图干掉我的单元测试,我试图使用AutoFixture作为IoC容器来实例化我的被测系统(SUT),在这种特殊情况下是ASP.NET MVC Controller
s 。因此,我想自定义AutoFixture来创建没有自动属性的控制器。
我尝试为ControllerBase
添加自定义,但它似乎不适用于ControllerBase
的子类。
fixture.Customize<ControllerBase>(c => c.OmitAutoProperties());
以下是我希望能够编写的测试示例:
[Theory, AutoFixtureData]
public void ControllerTest(AccountController controller) {
Assert.Equal(default(UrlHelper), controller.Url);
}
当然,如果我为项目中的每个特定控制器手动添加一个自定义,但是谁想要这样做呢?还有更好的方法吗?
答案 0 :(得分:7)
以下定制通过上述测试,并执行您似乎要求的内容
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);
}
}
}
但是,这会禁用所有MVC控制器的所有属性,包括User
,HttpContext
,ModelState
,Request
,{{1}在单元测试中你可能需要那些,所以你确定要这样做吗?
我将是第一个同意MVC Response
基类是一个巨大的SRP违规的人,但它是一个给我们的类,所以我们无能为力,除了试图制作最好的。
通常,您只需要稍微扭曲一下即可使AutoFixture自动填充大部分属性。
在MVC 3项目中,这与AutoMoq extension相结合,足以创建Controller实例:
Controller