如何将AutoFixture自定义应用于从基类inheritance的任何内容?
为了试图干掉我的unit testing,我试图使用AutoFixture作为IoC容器来实例化我的被测系统(SUT),在这种特殊情况下是ASP.NET MVC Controller
。 因此,我想自定义AutoFixture以创建没有自动属性的控制器。
我尝试为ControllerBase
添加自定义,但它似乎不适用于ControllerBase
子类。
fixture.Customize(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); } } }
但是,这会禁用所有 MVC控制器的所有属性,包括User
, HttpContext
, ModelState
, Request
, Response
等。您可能需要在unit testing中使用它们,所以您确定要这样做吗?
我将是第一个同意MVC Controller
基类是一个巨大的SRP违规的人,但它是给我们的一个类,所以除了试图充分利用它之外我们无能为力。
通常,您只需将其扭曲一点即可使AutoFixture自动填充大部分属性。
在MVC 3项目中,这与AutoMoq扩展相结合,足以创建Controller实例:
fixture.Customize(c => c .Without(x => x.Model) .Without(x => x.ModelType)); fixture.Inject(CultureInfo.CurrentCulture);