2014-01-30 70 views
21

我想測試我的類的方法A,但不調用通常由A調用的實際方法B.這是因爲B有很多外部交互,我現在不想測試。模擬Moq中正在測試的主題的方法?

我可以爲B所調用的所有服務創建嘲笑,但這是相當的工作。我寧願嘲笑B,讓它返回樣本數據。

Moq框架有可能嗎?

回答

28

這是,趕上! 您必須確保方法B是虛擬的並且可以被重寫。

然後,設置模擬以在不提供設置時調用基本方法。然後您設置B,但不要設置A。由於A未設置,因此將調用實際的實現。

var myClassMock = new Mock<MyClass>(); 
myClassMock.Setup(x => x.B()); //mock B 

myClassMock.CallBase = true; 

MyClass obj = myClassMock.Object; 
obj.A(); // will call the actual implementation 
obj.B(); // will call the mock implementation 

屁股的場面,起訂量,動態地創建一個擴展MyClass和覆蓋B類。

+2

準確地說,如果'virtual'方法'B'是'protected internal'或'public',它將會是最簡單的。 –

+0

問題:CallBase = true是什麼;做? – Hace

+1

@Hace如果我沒有記錯,它會告訴模擬對象調用'MyClass'中定義的方法,除非提供了明確的設置。如果你沒有調用'CallBase = true',那麼無論是否提供了明確的設置,Moq都會調用虛擬方法的虛擬實現。 – dcastro