我有一个用户控件,它在我想测试的 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();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)