具有多个相同类型的实例的构造方法

时间:2017-11-03 02:39:02

标签: c# unit-testing autofixture automoq

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

-1

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

1 个答案:

答案 0 :(得分:2)

的确,如果你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获取每个注入服务的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);
}

在切线上,作为一个设计原则我会说一个依赖是好的,两个相同的依赖也偶尔也是合适的,但是如果你有三个,你应该考虑改为使用它们的集合。 (一,二,多......