为什么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;为了能够设定期望?

为什么RhinoMocks必须显式地重新定义ToString(),以便能够对其设置期望值

接口不是对象。

尽管您可以在接口上隐式调用ToString(),但假设存在一些实现接口的object,因此隐式提供了ToString()的实现。

由于您没有提供接口的实现,因此没有什么可以"挂钩"ToString()方法,显然RhinoMocks认为测试一个实际上并不存在的方法没有多大意义。