2012-02-28 76 views
3

如果我有一個依賴關係IObjectA其中包含PropertyA類型IObjectB具有公共方法Foo()IObjectBMoq驗證鏈接

爲了Verify() Foo()被調用可以完成這兩個任務,這是正確的嗎?

Mock<IObjectA> objectA = new Mock<IObjectA>(); 
Mock<IObjectB> objectB = new Mock<IObjectB>(); 

//A 
objectA.Verify(x => x.PropertyA.Foo()); 

//B 
objectA.Verify(x => x.PropertyA); 
objectB.Verify(x => x.Foo()); 

「B」似乎更正確,但不會驗證和違背但是我調試「步」,「A」得到正確的結果。對象A可以被詢問其屬性和那些用於調用的屬性,即使它是一個模擬類型?

回答

4

爲什麼你認爲B更正確?

示例A說內部對象檢查PropertyA是否有foo調用它。

在這個例子中,objectA和objectB在任何情況下都沒有綁定在一起。因此,例子B似乎誤導了它的當前形式,因爲它試圖表明存在某種關係。

現在,如果您使用setup將objectB分配給objectA,那麼這兩個示例都應該有效(因爲您正在告訴Moq objectA如何與objectB相關)。執行此設置會創建您正在驗證的關係。

東西線沿線的:

objectA.Setup(x => x.PropertyA).Returns(objectB) 

這基本上說「當PropertyA被稱爲給我回對象B。」

+1

感謝,是從PropertyA返回對象B的伎倆。 objectA.Verify(x => x.PropertyA.Foo())也會驗證Foo()調用,是否爲假?有些人告訴我,x.PropertyA.Foo()是一個無效的調用,因爲objectA的屬性不能用於調用,這是正確的嗎? – TheWolf 2012-02-28 03:00:31

+0

您對A的正確和正確。我道歉,我正在閱讀和思考錯誤。我從測試的角度思考,即模擬如何處理理解的子調用,而不是來自具體實現的實際調用的視角。 – 2012-02-28 03:23:18