2010-02-08 80 views
3

我使用RhinoMocks進行一個非常簡單的測試(我必須說我是初學者)。我試圖嘲弄我的對象這樣如何繞過RhinoMocks模擬中的方法執行?

var mock = MockRepository.GenerateMock<MyClass>(); 

創建一個幫助存根:

var stubLinkedObject = MockRepository.GenerateStub<MyClass>(); 

然後執行一些邏輯應該與我的存根參數調用該方法的類MyClassAddLink。在測試結束時,我簡單地斷言,這種方法實際上是調用

mockAction.AssertWasCalled(a => a.AddLink(stubLinkedObject)); 

我注入了正確的依賴和方法實際上是調用。但是,問題在於MyClass中的real實現被調用並導致崩潰,因爲某些邏輯不能執行(鏈接集合不可用等)。我怎樣才能繞過執行並簡單地檢查一個方法是否被調用?我試過類似的東西

mockAction.Stub(a => a.AddLink(null)).IgnoreArguments().Do(null); 

在我進入執行前,但這似乎並沒有工作(我只有一些例外)。任何想法和可能解釋爲什麼模擬執行方法邏輯呢?

+1

你的方法AddLink是虛擬的嗎? – 2010-02-08 09:19:49

+0

不,它不是,可能是這個問題:) – 2010-02-08 13:41:35

+1

我很困惑。通常情況下,應該有一個被測試類的對象實例沒有被模擬/存根。你似乎只有嘲笑和存根。模擬和存根僅用於在測試過程中需要控制的協作者對象。 – 2010-02-08 15:53:41

回答

4

我試過重現。這是這對我來說

[Test] 
public void Test() 
{ 
    var classMock = MockRepository.GenerateMock<MyClass>(); 
    var linkedMock = MockRepository.GenerateStub<MyClass>(); 

    classMock.Expect(c => c.MyMethod(linkedMock)); 

    classMock.MyMethod(linkedMock); 

    classMock.AssertWasCalled(c => c.MyMethod(linkedMock)); 
} 

public class MyClass 
{ 
    public virtual void MyMethod(MyClass linkedClass) 
    { 
     Console.WriteLine("MyMethod is called"); 
    } 
} 
+0

這可能會起作用。謝謝;) – 2010-02-08 14:22:55

+1

像這個問題,這個答案讓我困惑。你用'AssertWasCalled'(用於佈置 - 執行斷言中的斷言階段)混合'Expect'(用於record-replay-verify中的記錄階段)。你不應該在同一個測試中混合兩種方法。 – 2010-02-08 23:11:52

+1

這是使用Rhino Mocks 3.5進行嘲諷的新模式。從MockRepository.GenerateMock()和MockRepository.GenerateStub()返回的Mocks/stub以重放模式返回,並且不需要顯式移動到重放模式。看看這裏http://www.ayende.com/Wiki/Rhino+Mocks+3.5.ashx#MockingwithandwithoutaninstanceofMockRepository – 2010-02-09 07:42:12

3

你的方法工作得很好,只會工作,如果你的方法AddLink是虛擬的代碼,否則.NET運行時將始終運行真正的實現(這是正確的)。

通常最好的做法是在進行依賴注入時使用接口(所以你的類需要IMyClass而不是MyClass)。這樣,使用模擬框架就容易多了 - 不僅不必記住所有方法都是虛擬的,而且避免了將正確參數傳遞給MyClass的構造函數的問題(在現實世界中這是一個痛苦)

相關問題