2013-02-20 2 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' какие-либо доступные для записи свойства? Предоставляет ли исключение более подробную информацию (например, трассировку стека)? –

ответ

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

+0

Примечание для других: мне пришлось добавить ссылку на 'System.Web.WebPages', чтобы получить это для компиляции –

+0

FYI, это также требуется для' MVC 5.1.2'. – MEMark