簡體   English   中英

為什么即使未設置任何期望,我的局部模擬也會模擬所有虛擬方法?

[英]Why does my partial mock have all virtual methods mocked, even if no expectations are set?

我有一個用戶控件,該控件在我要測試的ValidateChildren方法中進行了一些驗證。 我已經創建了用戶控件的部分模擬,但是盡管我沒有對ValidateChildren方法設置任何期望,但是我只是調用它,只是跳過了它,並且該方法中的代碼從不執行。 為了嘗試了解發生了什么,我創建了一個簡單的測試,如下所示:

public class Foo
{        
    public virtual bool Method1()
    {
        throw new NotImplementedException();
    }

    public virtual bool Method2()
    {
        return Method1();
    }
}

並使用它來測試它:

[Test]
public void TestFooMethods ()
{
    MockRepository m = new MockRepository();
    Foo foo = m.PartialMock<Foo>();

    RhinoMocksExtensions.Expect<Foo,bool>(
                             foo, 
                             delegate (Foo obj)
                             {
                                 return obj.Method1();
                             }
                         ).Return(true);

    Assert.IsTrue (foo.Method2());
}

現在我希望foo.Method1被嘲笑,而foo.Method2不被嘲笑。 但這總是返回false,如果我嘗試在調試器中執行foo.Method2(),那么我將無法執行。

有什么想法嗎?

如果模擬對象,則無論模擬類型如何,它都將覆蓋所有抽象/虛擬方法。 但是,您可以做的是對您的方法有所期待,並使用以下命令讓它執行被覆蓋的原始方法:

CallOriginalMethod(OriginalCallOptions.CreateExpectation);

您沒有像設計那樣使用Rhino Mocks,這也可能會給您帶來麻煩。 我以應使用C#3.0以及lambda和擴展方法編寫的方式重新編寫了您的測試:

[TestMethod]
public void TestFooMethods()
{
    //Generate a new Mock to test against
    Foo foo = MockRepository.GenerateMock<Foo>();

    //Expect a call to Method1 on object foo and return true
    foo.Expect(f => f.Method1()).Return(true);
    //Expect a call to Method2 on object foo and call the original method
    foo.Expect(f => f.Method2()).CallOriginalMethod(OriginalCallOptions.CreateExpectation);

    Assert.IsTrue(foo.Method2());

    //Verify all our expectations on foo
    foo.VerifyAllExpectations();
}

好吧,經過更多的嘗試(也許只是寫下問題可以幫助我更清楚地思考問題),我想我已經找到了解決方案。

看來我需要打電話:

RhinoMocksExtensions.Replay (foo);

在我打電話之前

Assert.IsTrue (foo.Method2 ());

可能需要在使用虛擬方法而不設置期望時明確告知Rhino模擬。 不知道為什么。 如果有人知道這個背后的原因,我很想知道。

無論如何,一切似乎都在進行,所以很開心。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM