AutoFixture fails to CreateAnonymous MVC Controller
Asked Answered
C

1

9

The code:

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

the Exception:

System.Reflection.TargetInvocationException: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NotImplementedException: The method or operation is not implemented.

MyController() takes 3 parameters.

I've tried the fix described in the answer here but it wouldn't work.

Caslon answered 20/2, 2013 at 17:17 Comment(1)
Which version of ASP.NET MVC are you using? How does the MyController constructor look? Does MyController have any writable properties? Does the exception provide more details (e.g. a stack trace)?Begrime
B
25

As it seems, when using MVC 4 you have to customize the Fixture instance in a different way.

The test should pass if you replace:

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

with:

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

Optionally, you can create a composite of the required customizations:

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

Then, the original test could be rewritten as:

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

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

    Assert.IsAssignableFrom<IController>(sut);
}
Bromide answered 20/2, 2013 at 21:3 Comment(3)
Note to others: I had to add a reference to System.Web.WebPages to get this to compileDeepfry
FYI this is also required for MVC 5.1.2.Entity
One issue is that whatever I do, the "c.Without" section throws a compile error.Voroshilovgrad

© 2022 - 2024 — McMap. All rights reserved.