我有以下測試:使用FakeItEasy,是有可能創造一個類型,採用一般類型的虛擬對象參數
[Fact]
public void StartProgram_CallsZoneProgramStart()
{
var zone = A.Fake<Zone>();
zone.StartProgram();
A.CallTo(() => zone.ZoneProgram.Start(null, A.Dummy<ActionBlock<InterruptInfo>>())).MustHaveHappened(Repeated.Exactly.Once);
}
這是創造它被傳遞到MustHaveHappened呼叫ActionBlock<InterruptInfo>
類型的虛擬。 zone.StartProgram明確地調用了zone.ZoneProgram.Start方法,但是這個調用並沒有被FakeItEasy看到。它返回以下錯誤消息:
Assertion failed for the following call:
ZoneLighting.ZoneProgramNS.ZoneProgram.Start(<NULL>, ActionBlock\`1 Id=1)
Expected to find it exactly once but found it #0 times among the calls:
1: ZoneLighting.ZoneProgramNS.ZoneProgram.Start(inputStartingValues: Faked ZoneLighting.ZoneProgramNS.InputStartingValues, interruptQueue: ActionBlock`1 Id=2)
2: ZoneLighting.ZoneProgramNS.ZoneProgram.Start(inputStartingValues: <NULL>, interruptQueue: ActionBlock`1 Id=2)
如可以從該錯誤消息中可以看出,在ActionBlocks的ID進行比較是不同的(1和2),這就是爲什麼它是無法看到該呼叫是製作。我的問題是,爲什麼啞鈴ActionBlock的ID = 1?我認爲是一個虛擬對象,它不應該有任何具體的細節,如ID等。這是因爲泛型不能被毀滅?
我在這裏看到類似的東西:https://github.com/FakeItEasy/FakeItEasy/issues/402
但我無法弄清楚,如果這是在談論同樣的事情或沒有。任何幫助將不勝感激。
感謝您的詳細回覆。我不知道密封的課程不能像這樣被弄糊塗。所以我的後續問題是:從測試角度來看,如何知道是使用虛擬還是使用.Ignored技術?在這兩種情況下,都需要該類型,但對象的實際行爲並不重要(從您的回覆中引用Dummy文檔)。 – Anshul
至於你關於僞造被測試物體是反模式的觀點,爲什麼會這樣?如果我們只是測試對象的「管道」以確保應該連接的部件按照方法調用連接,那該怎麼辦?如何在不僞造對象的情況下進行測試? – Anshul
傳遞給調用的參數無關緊要時使用「忽略」。一般來說,對於調用匹配語義,[Argument Constraints](https://github.com/FakeItEasy/FakeItEasy/wiki/Argument-Constraints)技術是可以使用的。 Dummy構造完成後,就像其他任何對象一樣,因此在'A.CallTo'中提供它就意味着它將與使用Equals的實際參數進行比較。如果你想比較說「真」,那麼你會關心答案,所以虛擬是一個不好的選擇。即使碰巧有效,也不清楚爲什麼。 –