我的班级有这样的方法:
internal virtual Something CreateSomething(){...}
这样做是为了在测试中我可以存根CreateSomething()
来返回一个模拟对象:
var something = ...; //some mock object
var t = MockRepository.GenerateStub<MyObject>();
t.Stub(x => x.CreateSomething()).Return(something);
这很好但现在CreateSomething()
在类构造函数中被调用,之后调用它,所以当我存根方法时,我的对象已经被创建了。
是否有一种解决方法不涉及更改设计,在构建时传递存根方法?如果不是,我可以考虑改变设计使用构造注入(我相信你们中有些人还是很想建议!)但我宁愿看看Rhino是否首先支持这个用例。
答案 0 :(得分:0)
在从类构造函数调用方法之前,无法存根该方法。这是C#限制。这是合理的 通常,从构造函数调用虚方法是一种不好的做法,因为可能结果不是预期的结果。详情请见Virtual member call in a constructor。
所以,我强烈建议要么使这个方法非虚拟,要么避免从构造函数中调用它 无论如何,在这种情况下,它不会像虚拟一样工作。
关于测试方法的问题,该方法是从构造函数调用的。
我认为,这是一种私人方法。否则,它可以作为常规公共方法进行测试
由于它是私有的,因此无需单独测试此特定方法。我建议在测试构造函数和测试私有方法时遵循一般方法:不要测试私有方法
测试公众可见效果。那可能是:
请通过以下链接查找有关此主题的更多详细信息:
Is it important to unit test a constructor?
Unit testing private methods in C#