如何将AutoFixture自定义应用于从基类继承的任何内容?

Bra*_*bby 7 c# unit-testing autofixture

为了试图干掉我的单元测试,我试图使用AutoFixture作为IoC容器来实例化我的被测系统(SUT),在这种特殊情况下是ASP.NET MVC Controller.因此,我想自定义AutoFixture以创建没有自动属性的控制器.

我尝试添加自定义ControllerBase,但它似乎不适用于子类ControllerBase.

fixture.Customize<ControllerBase>(c => c.OmitAutoProperties());
Run Code Online (Sandbox Code Playgroud)

这是我希望能够编写的测试示例:

    [Theory, AutoFixtureData]
    public void ControllerTest(AccountController controller) {
        Assert.Equal(default(UrlHelper), controller.Url);
    }
Run Code Online (Sandbox Code Playgroud)

当然,如果我为项目中的每个特定控制器手动添加一个自定义,但是谁想要这样做呢?有没有更好的办法?

Mar*_*ann 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,禁用所有所有MVC控制器的性能,其中包括User,HttpContext,ModelState,Request,Response,等您可能需要那些在单元测试中,所以你确定你要这么做?

我将是第一个同意MVC Controller基类是一个巨大的SRP违规的人,但它是给我们的一个类,所以除了试图充分利用它之外我们无能为力.

通常,您只需稍微扭曲一下即可使AutoFixture自动填充大部分属性.

在MVC 3项目中,这与AutoMoq扩展相结合,足以创建Controller实例:

fixture.Customize<ModelBindingContext>(c => c
    .Without(x => x.Model)
    .Without(x => x.ModelType));
fixture.Inject(CultureInfo.CurrentCulture);
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的建议.我正在使用MVC4,还必须添加`fixture.Customize <ControllerContext>(c => c.Without(x => x.DisplayMode));` (2认同)