为什么我的部分模拟会嘲笑所有虚拟方法,即使没有设定期望?

时间:2009-04-30 09:20:21

标签: c# .net mocking rhino-mocks partial-mocks

我有一个用户控件,它在我想测试的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(),我就不能介入它了。

任何想法为什么?

2 个答案:

答案 0 :(得分:5)

如果你模拟一个对象,它将覆盖所有的抽象/虚拟方法,而不管mock的类型如何。你可以做的是对你的方法做一个期望并告诉它执行它覆盖的原始方法:

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();
}

答案 1 :(得分:0)

好的,经过一些更多的游戏(或许只是写下问题帮助我更清楚地思考它)我想我找到了解决方案。

似乎我需要打电话:

RhinoMocksExtensions.Replay (foo);
在我打电话之前

Assert.IsTrue (foo.Method2 ());

当使用虚拟方法而不是设定期望时,可能需要明确告知Rhino模拟。不知道为什么。如果有人知道这背后的原因,我很想知道。

无论如何,一切似乎都在起作用,所以快乐的日子。