为什么RhinoMocks有义务明确重新定义ToString()以便能够设置它的期望?

时间:2012-03-13 17:06:07

标签: c# mocking rhino-mocks

我正在尝试模拟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不会考虑为每个框架的对象提供这样的标准方法,并且有义务重新定义所有方法/属性;为了能够设定期望,这是非常明智的吗?

1 个答案:

答案 0 :(得分:6)

接口are not objects

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

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