微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我怎么能覆盖 AutoFixture AutoMoqCustomization

如何解决我怎么能覆盖 AutoFixture AutoMoqCustomization

我使用 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。如何实现我想要的行为?

解决方法

我就是这样做的:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?