C# 为什么RhinoMocks有义务显式地重新定义ToString(),以便能够设置对它的期望?

C# 为什么RhinoMocks有义务显式地重新定义ToString(),以便能够设置对它的期望?,c#,mocking,rhino-mocks,C#,Mocking,Rhino Mocks,我正在尝试对我的自定义对象模拟ToString()调用。我已经为接口创建了一个模拟,并在ToString()call上设置了期望值 interface ICustomObject { } var customObjectMock = MockRepository.GenerateMock<ICustomObject>(); var fakeDump = Guid.NewGuid().ToString(); customObjectMock.Expect(c => c.ToSt

我正在尝试对我的自定义对象模拟
ToString()
调用。我已经为接口创建了一个模拟,并在
ToString()
call上设置了期望值

interface ICustomObject
{
}

var customObjectMock = MockRepository.GenerateMock<ICustomObject>();
var fakeDump = Guid.NewGuid().ToString();
customObjectMock.Expect(c => c.ToString()).Return(fakeDump).Repeat.Any();
在此之后,RM允许在
ToString()
上设置期望值

只是想知道为什么RinoMocks要求我重新定义标准的虚拟
对象。ToString()
?也许RM不考虑可用于每个框架对象的此类标准方法,并且必须重新定义所有方法/属性ExpL;为了能够设置期望值,请使用ICITY?

接口

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


由于您没有提供接口的实现,因此没有任何东西可以“钩住”
ToString()
方法,并且显然Rhinomock认为测试一个实际上不存在的方法没有多大意义。

自定义对象中的
ToString()
方法真的是虚拟的吗,或者您是否覆盖了
ToString()
使用您自己的非虚拟声明?我只是使用我的接口创建一个模拟并设置期望值,所以不使用任何自定义对象。-<代码>公共虚拟字符串ToString()
Rhinomock是否要求您为除
ToString()
之外的其他方法设置此类期望值?如果没有自定义对象,并且在接口中没有方法声明,我不确定RhinoMocks甚至如何知道您的方法,包括
ToString()
。我希望RM能够选择
object
方法,因为所有东西都继承自
object
类,并且都有对象的方法插入面。尽管可以在接口上隐式调用
ToString()
,但假设存在实现接口的
对象,因此隐式提供了
ToString()
的实现。我不认为这像你相信的那么简单。这对我来说很有意义。再次感谢!顺便说一句,我只是想知道如果Rhinomock允许对这些基本对象方法设置期望值是否正确,否则我必须重新定义这些方法,以满足Rhinomock/(反射?)在界面中的要求,界面看起来很奇怪,没有特别注释
ToString()的目的
是为了提供一种人类可读的对象表示。除了证明它确实返回了一些东西之外,为什么还需要对其进行单元测试呢?有了复杂的OBEJCT层次结构,我希望确保顶级父级将所有子级的详细信息转储到ToString()中。两个子/父重写
ToString()
。因此,我模拟childs,传入父级(root),然后调用
root.ToString()
,为了提供wel--模拟的childs,我必须模拟
ToString()
调用childs。我正在记录这个
ToString()
,所以这是非常重要的一点-确保转储了正确的信息。我可以提供自己的
public string DumpDetails()
,但决定使用
ToString()
,你怎么想?但是如果你在层次结构中的任何
ToString()
的实现中更改一个字符,它会破坏所有的单元测试。
ToString()
的实现对应用程序的操作至关重要吗?不应该这样。我想确保
root.ToString()
转储所有层次结构细节,并且我在test-root中只使用一个真实对象,所有子对象都被模拟。
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();
}