[英]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.