Stubbing在RhinoMocks中的类构造函数中调用的方法



我的类有一个这样的方法:

internal virtual Something CreateSomething(){...}

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

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

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

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

在从类构造函数调用该方法之前,无法对其进行存根处理。这是C#的限制。这是合理的
通常,从构造函数调用虚拟方法是一种糟糕的做法,因为结果可能与预期的不一样。请参阅此处的详细信息:构造函数中的虚拟成员调用。

因此,我强烈建议将此方法设为非虚拟方法,或者避免从构造函数调用它
无论如何,在这种情况下,它不会像虚拟的那样工作。

关于您关于测试方法的问题,该方法是从构造函数调用的
我想,这是一种私人方法。否则,它可以作为常规的公共方法进行测试
由于它是私有的,因此没有必要孤立地测试这个特定的方法。我建议在测试构造函数和测试私有方法时遵循通用方法:不要测试私有方法
测试公共可见效果。可能是:

  • 公共属性初始化
  • 模拟依赖调用或属性访问
  • 引发异常
  • 等等

请通过以下链接找到有关此主题的更多详细信息:
单元测试构造函数重要吗
C#中的单元测试私有方法

最新更新