2012-07-09 83 views
11

對於單元測試,我使用的是NUnit 2.6和Moq 4.0。有一個關於虛擬成員的特殊情況,其中Moq的代理對象不會將方法調用傳遞給實際的實現(可能是通過設計)。舉例來說,如果我有一類...嘲笑Moq中的虛擬成員

public class MyClass { 
    protected virtual void A() { 
     /* ... */ 
    } 

    protected virtual void B(...) { 
     /* ... */ 
    } 
} 

...我使用起訂量來覆蓋在我的測試夾具GetSomethingElseA()方法...

var mock = new Mock<MyClass>(); 
mock.Protected().Setup("A").Callback(SomeSortOfCallback); 

...使用模擬的A方法出色地工作;然而,如果該方法中的任何內容都會調用not-mocked方法B,那麼即使MyClass中存在實際實現,該方法也不會執行任何操作和/或返回默認值。

有沒有辦法解決這個問題?我使用Moq錯了嗎?

由於提前,
曼尼

回答

17

設置mock.CallBase = true,你應該是好去。

+0

如果你還想嘲笑其他方法呢? – 2012-08-31 10:33:05

+1

@LouisRhys很確定這不會干擾它 - 如果你明確地模擬一些東西,CallBase設置永遠不會起作用。 – 2012-09-01 09:00:29

-1
var systemUnderTest = new Moq.Mock<ProcessBulkData> { CallBase = true }; 
systemUnderTest.Setup(s => s.MethodName(...)).Returns(...); 
var actual=systemUnderTest.Object.BulkInsert(...); 
+3

最好包括代碼的一些解釋和答案。 – EJoshuaS 2016-12-16 21:23:03