1

我的班级有这样的方法:

internal virtual Something CreateSomething(){...}

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

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

这工作正常,但现在CreateSomething()在类构造函数中调用,然后再调用它,所以当我存根方法时,我的对象已经创建。

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

4

1 回答 1

0

在从类构造函数调用方法之前,无法对方法进行存根。这是 C# 的限制。这是合理的。
一般来说,从构造函数调用虚方法是一种不好的做法,因为结果可能不是预期的。在此处查看详细信息:构造函数中的虚拟成员调用

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

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

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

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

于 2017-02-08T08:56:56.810 回答