Dot-Net

Rhino Mocks 存根和模擬僅適用於介面?

  • March 5, 2010

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。

引用自:https://stackoverflow.com/questions/2388033