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

C# 如何将AutoFixture自定义应用于从基类继承的任何内容?,c#,unit-testing,autofixture,C#,Unit Testing,Autofixture,为了使我的单元测试干涸,我尝试使用AutoFixture作为IoC容器来实例化我的被测系统(SUT),在这种特殊情况下,它是ASP.NET MVCControllers。因此,我希望自定义AutoFixture以创建没有自动属性的控制器 我尝试为ControllerBase添加自定义项,但它似乎不适用于ControllerBase的子类 fixture.Customize<ControllerBase>(c => c.OmitAutoProperties()); 当然,如果我

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

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

fixture.Customize<ControllerBase>(c => c.OmitAutoProperties());

当然,如果我为我的项目中的每个特定控制器手动添加一个自定义项,它是可以工作的,但是谁想这样做呢?有更好的方法吗?

以下定制通过了上述测试,并按照您的要求进行了操作

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控制器的所有属性,包括
用户
HttpContext
模型状态
请求
响应
,等等。您可能需要在单元测试中使用这些属性,因此确定要这样做吗

我将是第一个同意MVC
Controller
基类是一个严重违反SRP的类的人,但它是给我们的一个类,所以我们除了尽力充分利用它之外别无选择

通常,只需稍微扭曲它,即可使AutoFixture自动填充大多数特性

在MVC 3项目中,这一点与的结合足以创建控制器实例:

fixture.Customize<ModelBindingContext>(c => c
    .Without(x => x.Model)
    .Without(x => x.ModelType));
fixture.Inject(CultureInfo.CurrentCulture);
fixture.Customize(c=>c
.无(x=>x.Model)
.没有(x=>x.ModelType));
fixture.Inject(CultureInfo.CurrentCulture);

谢谢你的建议。我使用的是MVC4,还必须添加
fixture.Customize(c=>c.Without(x=>x.DisplayMode))
fixture.Customize<ModelBindingContext>(c => c
    .Without(x => x.Model)
    .Without(x => x.ModelType));
fixture.Inject(CultureInfo.CurrentCulture);