我試圖測試一個需要工廠的類(Func<T>
),我正在使用Moq和AutoFixture。如何測試需要工廠的班級?
設置「環境」以查看工廠是否已被使用以及在返回的實例上使用了多少次以及使用了哪些方法的最佳方式是什麼?
目前我Mock'ing的T
和Injecting
一個Func<T>
,保持所有的計數返回模擬實例:
public class SystemUnderTest {
public SystemUnderTest(Func<IMyClass> c)
{
try {
var c1 = c();
c1.Name="n1";
c1.Send();
}
catch(Exception){
var c2 = c();
c2.Name="n2";
c2.Send();
}
}
}
private Mock<IMyClass> MockFactory()
{
var m = new Mock<IMyClass>();
m.SetupProperty(mc=>mc.Name);
_returnedStubs.Add(m);
return m;
}
[Test]
public void TestSomething()
{
var fixture = new Fixture();
fixture.Inject(()=>MockFactory().Object)
var sut = fixture.CreateAnonymous<SystemUnderTest>();
Assert.That(_returnedStubs.Count,Is.Equal(1));
_returnedStubs[0].Verify(m=>m.Send(),Times.Exactly(1));
_returnedStubs[0].Verify(m=>m.Name = "n1");
}
但感覺有點玄乎/醜陋的我。我很確定測試類中的實例變量是危險的東西
雖然我意識到這可能是一個嘗試將問題減少到可管理的大小,但我不知道你在做什麼? MyClass是一個具體的類嗎?爲什麼它創造了多少次? – 2012-03-23 13:14:18
這很有趣,因爲'IMyClass'是一個收集數據的類,它在Web服務上發送它。但是,如果IMyClass的第一個實例的數據收集引發異常,則使用特定消息創建另一個實例,並且我想驗證:「instance1引發異常時:1)創建instance2,並且2)instance2獲取第一個異常的消息,以及3)不應該創建更多的實例「 – svrist 2012-03-23 13:31:43
我明白了。但是,IMyClass API中存在暫時耦合,這使測試更加困難。如果你改變API來啓用諸如'c1.Send(「n1」);'......這樣的反饋會更容易,這個反饋與AutoFixture真的沒有任何關係,但它也會讓你更容易。 – 2012-03-23 13:48:13