Dot-Net
Rhino Mocks 存根和模擬僅適用於介面?
Rhino Mocks 存根和模擬僅適用於介面而不適用於具體類是否正確?我花了很長時間試圖讓這段程式碼正常工作。我沒想到存根的 pubSubClient 總是從類中呼叫 Send 方法。該方法具有一些依賴性並引發異常。
[Test] public void Test01() { PubSubMessage psm = new PubSubMessage(); var pubSubClient = MockRepository.GenerateStub<PubSubClient>(); pubSubClient.Stub(x => x.Send(psm)).IgnoreArguments().Return(null); // actual PubSubClient Send method throws exception // the rest of the test is skipped... }但是,當我提取介面並使用 IPubSubClient 執行相同的測試時,它似乎按預期工作。
這是否意味著我必須為我想用 Rhino 模擬/存根的每個類提取介面?或者我在技術上或概念上遺漏了什麼?
更新:好的,看來我知道我錯過了什麼部分: Rhino Mocks 無法攔截對非虛擬方法的呼叫。所以,我想我要麼使用介面,要麼使具體類上的每個方法都是虛擬的。如果還有其他選擇,請糾正我。
Bryan 使用部分模擬的答案是不正確的。這不是部分模擬的用途。
Jon Erickson 的回答大多是正確的:Rhino Mocks 和 Moq 不能攔截非虛擬呼叫,也不能攔截靜態方法或屬性。這意味著您不能偽造以下內容:
DateTime.Now; // static property, can't fake static property someClass.SomeNonVirtualMethod(); // can't fake non-virtual method sealedClass.Foo(); // can't fake anything on sealed classes Utilities.SomeStaticMethod(); // can't fake static methods someList.Any(); // can't fake extension methods like Linq's .Any()正如 Jon 所說,TypeMock 可以偽造這些。
需要注意的是,還有一個可以攔截所有呼叫的附加模擬框架:Microsoft Moles 框架。它的工作方式與 TypeMock 相同,它使用 .NET 分析器 API 來攔截呼叫。
Moles 是免費的(目前)。它也是測試版。Moles 僅適用於Microsoft Pex 工具。而且它的 API 明顯不如 TypeMock 精緻、優雅的 API。