我有一个带有这样的构造函数的类:

MyClass(MySetting, IMyService, IMyService, IMyService)

在这种情况下,如何使用 AutoFixture 创建 MyClass?我知道当它只有一个 IMyService 参数时,我们可以使用 AutoMoqFreeze 一个模拟,但在这种情况下,我不确定我们可以 Freeze 三个模拟,因为我认为最后一个将用于所有三个参数。

最佳答案

事实上,如果你对一个对象进行 Freeze 编码,你每次请求都会得到同一个对象;这就是 Freeze 的重点。

这种情况我通常做的就是在类中加入 Inspection Properties ,因为 你写的东西,你也可以暴露 :

public class MyClass
{
    public MyClass(
        MySetting setting,
        IMyService service1,
        IMyService service2,
        IMyService service3)
    {
        this.Service1 = service1;
        this.Service2 = service2;
        this.Service3 = service3;
    }

    public IMyService Service1 { get; }
    public IMyService Service2 { get; }
    public IMyService Service3 { get; }

    public string DoIt()
    {
        return
            this.Service1.Whatever() +
            this.Service2.Whatever() +
            this.Service3.Whatever();
    }
}

您可以使用 Mock.Get 为每个注入(inject)的服务获取 Mock,如本测试所示:
[Fact]
public void AskTheSut()
{
    var fixture = new Fixture().Customize(new AutoMoqCustomization());
    var sut = fixture.Create<MyClass>();
    Mock.Get(sut.Service1).Setup(s => s.Whatever()).Returns("foo");
    Mock.Get(sut.Service2).Setup(s => s.Whatever()).Returns("bar");
    Mock.Get(sut.Service3).Setup(s => s.Whatever()).Returns("baz");

    var actual = sut.DoIt();

    Assert.Equal("foobarbaz", actual);
}

顺便提一下,作为设计原则,我会说一个依赖项很好,两个相同的依赖项偶尔也合适,但如果你有三个,你应该考虑使用它们的集合。 (一,二,很多……)

关于c# - 具有多个相同类型实例的构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47087644/

10-12 06:49