AutoFixture无法创建匿名的MVC控制器。

9

代码:

IFixture fixture = new Fixture().Customize(new AutoMoqCustomization());
fixture.Customize<ViewDataDictionary>(c => c.Without(x => x.ModelMetadata));
var target = fixture.CreateAnonymous<MyController>();

异常:

System.Reflection.TargetInvocationException: System.Reflection.TargetInvocationException:调用目标的异常已被抛出。---> System.NotImplementedException: 方法或操作未实现。

MyController()需要3个参数。

我尝试了这里回答中描述的修复方法,但它不起作用。


2
你使用的是哪个版本的ASP.NET MVC?MyController构造函数是什么样子的?MyController有任何可写属性吗?异常提供了更多细节吗(例如堆栈跟踪)? - Mark Seemann
1个回答

25

似乎在使用MVC 4时,您需要以不同的方式自定义Fixture实例。

如果您替换,测试应该通过:

fixture.Customize<ViewDataDictionary>(c => c
    .Without(x => x.ModelMetadata));

with:

随着:
fixture.Customize<ControllerContext>(c => c
    .Without(x => x.DisplayMode));

可选地,您可以创建所需自定义的组合


internal class WebModelCustomization : CompositeCustomization
{
    internal WebModelCustomization()
        : base(
            new MvcCustomization(),
            new AutoMoqCustomization())
    {
    }

    private class MvcCustomization : ICustomization
    {
        public void Customize(IFixture fixture)
        {
            fixture.Customize<ControllerContext>(c => c
                .Without(x => x.DisplayMode));
        }
    }
}

那么,原始测试可以重写为:

[Fact]
public void Test()
{
    var fixture = new Fixture()
        .Customize(new WebModelCustomization());

    var sut = fixture.CreateAnonymous<MyController>();

    Assert.IsAssignableFrom<IController>(sut);
}

注意:我不得不添加对System.Web.WebPages的引用才能使其编译。 - Jay Sullivan
顺便提一下,这也适用于 MVC 5.1.2 - MEMark
一个问题是无论我做什么,"c.Without" 部分都会抛出编译错误。 - Rich Bryant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接