没有太多的测试经验,试图通过测试我最近制作的库来改变它。
使用nunit和nsubstitute进行此操作。
所以我的情况是这样的一个类:
class MyClassToTest {
private ISomeOtherClass MyPrivateClass { get;set }
public MyClassToTest() {
MyPrivateClass = new SomeOtherClass();
}
public void DoSomething() {
MyPrivateClass.SayHello();
}
}
现在,对DoSomething
方法的测试将是查看SayHello()
实际上是否在ISomeOtherClass
实例上调用方法。
问题是它是私有的,当查找测试它的最佳方法时,唯一出现的是将属性设置为内部并将InternalsVisibleToAttribute
设置为测试所在的程序集。
虽然这个解决方案有效并且我的库的外部接口仍然可以,但是在库的上下文中该属性的正确访问器仍然是私有的。
我写的测试是在内部完成之后:
public void MyTest() {
var objPrivateClass = Substitute.For<ISomeOtherClass>();
var obj = new MyClassToTest();
obj.MyPrivateClass = objPrivateClass;
obj.DoSomething();
objPrivateClass.Received().SayHello();
}
有没有更好的方法来测试这个,而我不必修改我的原始代码,使其可测试?
它可能是设置InternalsVisibleToAttribute并使属性内部是正确的事情,但几个小时前我不知道InternalsVisibleToAttribute
的存在所以最好问:)
要回答确切的问题,您可以使用反射来联系私人成员,但这是一个脆弱而缓慢的解决方案。
我能给你的最好建议是私人物品应该保密;通过公共接口测试对象的行为。因此,如果太大而且难以测试,只需将其重构为可测试的。考虑单一责任原则和控制原则反转。
编辑1:您可能正在寻找依赖注入的概念。大多数时候这应该没问题;然而,当我们谈论高度可重用的库(你提到你正在创建一个lib)时,其他解决方案可能更适合你的库用户(例如创建一个Facade或重新思考你的设计)。