簡體   English   中英

具有多個相同類型的實例的構造方法

[英]Constructor with more than one instance of same type

我有一個像這樣的構造函數的類:

MyClass(MySetting, IMyService, IMyService, IMyService)

在這種情況下,如何使用AutoFixture創建MyClass 我知道當它只有一個IMyService參數時,我們可以使用AutoMoq Freeze模擬,但在這種情況下我不確定我們可以Freeze三個模擬,因為我認為最后一個將用於所有三個參數。

實際上,如果你Freeze一個物體,每次你要它時你都會得到同樣的物體; 這就是Freeze

在這種情況下我通常做的是將檢查屬性添加到類中,因為你編寫的內容,你也可以暴露

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

在切線上,作為一個設計原則我會說一個依賴是好的,兩個相同的依賴也偶爾也是合適的,但是如果你有三個,你應該考慮改為使用它們的集合。 一,二,很多......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM