2013-02-20 64 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