【发布时间】:2011-09-19 11:13:32
【问题描述】:
这个问题可能会被多次问到 RhinoMocks,但我会尝试以不同的方式呈现。我在下面有这样的情况 -
class A
{
X parentOfB;
A()
{
X parentOfB = someObj;
if(<something>)
{
B objB = parentOfB as B // NOTE THIS
if(objB.Foo) // call the property here
{
// some code ....
}
}
}
}
class B : X
{
// gets initialised to true somewhere in the program. Don't bother much
protected bool status ;
B() {}
// Property
public bool Foo
{
return status;
}
}
嘲讽: 现在,我想做这样的事情 -
var mock = new MockRepository();
var myObjB = mock.StrictMock<B>();
// call Db class to populate the objB object and then set the expectation as
// below
// ...
// ...
Expect.Call(myObjB.Foo).Return(true);
mock.ReplayAll();
var objA = new A();
mock.VerifyAll();
错误: 无效调用,已使用最后一次调用或未进行任何调用(确保您正在调用虚拟 (C#) / 可覆盖 (VB) 方法)。
问题是,在 A 的 ctor 中访问具体类 B 以访问属性。如何在 RhinoMocks 中处理这种情况?如果我将属性 Foo 设为虚拟,它可以正常工作。但是,我不想那样做。
【问题讨论】:
-
这是意料之中的,错误说明了原因:
make sure that you are calling a virtual (C#)- 所以尝试将 Foo 设为虚拟! -
Carsten- 我正在为我的代码寻求替代方案或更好的设计。我已经提到过 - _ 如果我将属性 Foo 设为虚拟,它可以正常工作。但是,我不想那样做。_
-
您想要一个更好的可测试/可模拟设计 - 轻松将方法提取到接口中并模拟这些......
标签: c# unit-testing mocking rhino-mocks