对在RhinoMocks中的类构造函数中调用的方法进行存根

时间:2017-01-17 13:13:19

标签: c# mocking rhino-mocks rhino-mocks-3.5

我的班级有这样的方法:

internal virtual Something CreateSomething(){...}

这样做是为了在测试中我可以存根CreateSomething()来返回一个模拟对象:

var something = ...; //some mock object
var t = MockRepository.GenerateStub<MyObject>();
t.Stub(x => x.CreateSomething()).Return(something);

这很好但现在CreateSomething()在类构造函数中被调用,之后调用它,所以当我存根方法时,我的对象已经被创建了。

是否有一种解决方法不涉及更改设计,在构建时传递存根方法?如果不是,我可以考虑改变设计使用构造注入(我相信你们中有些人还是很想建议!)但我宁愿看看Rhino是否首先支持这个用例。

1 个答案:

答案 0 :(得分:0)

在从类构造函数调用方法之前,无法存根该方法。这是C#限制。这是合理的 通常,从构造函数调用虚方法是一种不好的做法,因为可能结果不是预期的结果。详情请见Virtual member call in a constructor

所以,我强烈建议要么使这个方法非虚拟,要么避免从构造函数中调用它 无论如何,在这种情况下,它不会像虚拟一样工作。

关于测试方法的问题,该方法是从构造函数调用的。
我认为,这是一种私人方法。否则,它可以作为常规公共方法进行测试 由于它是私有的,因此无需单独测试此特定方法。我建议在测试构造函数和测试私有方法时遵循一般方法:不要测试私有方法 测试公众可见效果。那可能是:

  • 公共属性初始化
  • 模拟依赖项调用或属性访问
  • 抛出异常

请通过以下链接查找有关此主题的更多详细信息:
Is it important to unit test a constructor?
Unit testing private methods in C#