我正在尝试模拟ToString()
调用我的自定义对象。我已经为界面创建了一个模拟,并在ToString()
调用
interface ICustomObject
{
}
var customObjectMock = MockRepository.GenerateMock<ICustomObject>();
var fakeDump = Guid.NewGuid().ToString();
customObjectMock.Expect(c => c.ToString()).Return(fakeDump).Repeat.Any();
在测试运行期间,我得到了运行时异常说:
System.InvalidOperationException:无效的通话,最后一次通话有 已被使用或未进行任何通话(确保您正在拨打电话 虚拟(C#)。
众所周知的错误,但为什么我认为ToString()
是虚拟的?
更有趣 - 我只是通过在界面中明确定义ToString()
来解决这个问题:
interface ICustomObject
{
// Weird! I believe such method definition in interface would be confusing
// without a special remark comment saying that this method is redefined
// to satisfy RhinoMocks (perhaps Reflection?)
string ToString();
}
此RM允许在ToString()
上设置期望。
只是想知道为什么RinoMocks要求我重新定义标准虚拟Object.ToString()
?也许RM不会考虑为每个框架的对象提供这样的标准方法,并且有义务重新定义所有方法/属性;为了能够设定期望,这是非常明智的吗?
答案 0 :(得分:6)
虽然您可以隐式地在接口上调用ToString()
,但假设存在一些实现您的接口的object
,因此隐式地提供了ToString()
的实现。
由于你没有提供你的接口的实现,没有什么可以“挂钩”ToString()
方法,显然RhinoMocks认为测试一个实际上没有的方法没有多大意义存在。