2013-02-20 62 views
7

的代码:AutoFixture未能CreateAnonymous MVC控制器

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个参数。

我已经尝试了回答here中描述的修复程序,但它不起作用。

+2

哪个ASP.NET MVC的版本是您使用? MyController构造函数看起来如何? MyController是否有任何可写属性?异常是否提供更多细节(例如堆栈跟踪)? – 2013-02-20 20:53:46

回答

21

As it seems,当使用MVC 4时,您必须以不同的方式自定义Fixture实例。

测试应该通过,如果你更换

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

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

或者,您可以创建所需的自定义项的composite

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); 
} 
+0

天才!谢谢。 – Tsar 2013-02-21 09:36:43

+0

给别人的提示:我不得不添加一个对'System.Web.WebPages'的引用来编译 – 2013-06-27 19:26:18

+0

FYI,这也是'MVC 5.1.2'所必需的。 – MEMark 2014-05-15 11:47:40