【问题标题】:How could I override AutoFixture AutoMoqCustomization我怎么能覆盖 AutoFixture AutoMoqCustomization
【发布时间】:2020-12-19 13:59:35
【问题描述】:

我使用AutoMoqCustomization 来创建带有数据的接口实例。它工作得很好,但现在我需要用我的自定义值覆盖一个成员。这就是我想要做的:

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

所以在这里我想得到这样的东西:

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

但我明白了

test1
test2 test2

用于自定义 1 和自定义 2。如何实现我想要的行为?

【问题讨论】:

    标签: c# .net autofixture


    【解决方案1】:

    我就是这样做的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多