Search code examples
c#.netautofixture

How could I override AutoFixture AutoMoqCustomization


I use AutoMoqCustomization to create interface instances with data. It worked fine but now I need to override one member with my custom value. This is what I am trying to do:

public interface ITest
{
    string Test1();
    string Test2();
}

class Program
{
    static void Main(string[] args)
    {
        var fixture = new Fixture();
        var customization1 = new CompositeCustomization(
            new AutoMoqCustomization {ConfigureMembers = true}, new Test2Customization());
        var customization2 = new CompositeCustomization(
            new Test2Customization(), new AutoMoqCustomization { ConfigureMembers = true });
        fixture.Customize(customization1);
        //fixture.Customize(customization2);
        //fixture.Customize(new AutoMoqCustomization { ConfigureMembers = true });
        var test = fixture.Create<ITest>();
        Console.WriteLine($"test1 {test.Test1()}");
        Console.WriteLine($"test2 {test.Test2()}");
    }

    private class Test2Customization : ICustomization
    {
        public void Customize(IFixture fixture)
        {
            fixture.Customize<Mock<ITest>>(mock => mock
                .Do(m => m.Setup(t => t.Test2()).Returns("test2")));
        }
    }
}

So here I want to get something like this:

test1 f057a124-e821-4c24-acaa-ed76a4820e8b
test2 test2

but I get

test1
test2 test2

for both customization1 and customization2. How can I implement the behaviour I want?


Solution

  • This is how I did that:

    public interface ITest
    {
        string Test1();
        string Test2();
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            var fixture = new Fixture();
            fixture.Customize(new AutoMoqCustomization());
            var test = fixture.Create<ITest>();
            Console.WriteLine($"test1 {test.Test1()}");
            Console.WriteLine($"test2 {test.Test2()}");
        }
    }
    
    public class AutoMoqCustomization : ICustomization
    {
        public void Customize(IFixture fixture)
        {
            if (fixture == null) throw new ArgumentNullException(nameof(fixture));
    
            ISpecimenBuilder mockBuilder = new MockPostprocessor(
                new MethodInvoker(
                    new MockConstructorQuery()));
    
            mockBuilder = new Postprocessor(
                builder: mockBuilder,
                command: new CompositeSpecimenCommand(
                    new StubPropertiesCommand(),
                    new MockVirtualMethodsCommand(),
                    new AutoMockPropertiesCommand(),
                    new CustomSpecimenCommand()));
    
            fixture.Customizations.Add(mockBuilder);
            fixture.ResidueCollectors.Add(new MockRelay());
        }
    
        private class CustomSpecimenCommand : ISpecimenCommand
        {
            public void Execute(object specimen, ISpecimenContext context)
            {
                Handle((dynamic)specimen);
            }
    
            private void Handle(object mock)
            {
            }
    
            private void Handle(Mock<ITest> mock)
            {
                mock.Setup(m => m.Test2()).Returns("test2");
            }
        }
    }