2

我有一个用户控件,它在我想测试的 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() 会被单步执行,我无法介入。

任何想法为什么?

4

2 回答 2

5

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

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();
}
于 2009-04-30T09:36:23.713 回答
0

好的,经过更多的尝试(也许只是把问题写下来帮助我更清楚地思考它)我想我已经找到了解决方案。

看来我需要打电话:

RhinoMocksExtensions.Replay (foo);

在我打电话之前

Assert.IsTrue (foo.Method2 ());

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

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

于 2009-04-30T09:44:02.777 回答