[英]Why are controllers in ASP.NET mvc RC2 partial classes and all the action methods are virtual
[英]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.