Search code examples
c#.netunit-testingautofixtureautomoq

AutoFixture fails to CreateAnonymous MVC Controller


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.


Solution

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