为什么RhinoMocks必须显式地重新定义ToString(),以便能够对其设置期望值
本文关键字:ToString 期望值 设置 定义 RhinoMocks 新定义 为什么 | 更新日期: 2023-09-27 18:27:44
我正在尝试模拟自定义对象上的ToString()
调用。我已经为接口创建了一个mock,并设置了对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没有考虑可用于每个框架对象的标准方法,并有义务重新定义所有方法/属性expl;为了能够设定期望?
接口不是对象。
尽管您可以在接口上隐式调用ToString()
,但假设存在一些实现接口的object
,因此隐式提供了ToString()
的实现。
由于您没有提供接口的实现,因此没有什么可以"挂钩"ToString()
方法,显然RhinoMocks认为测试一个实际上并不存在的方法没有多大意义。