Nsubstitute 测试是否调用了私有 class 的方法
Nsubstitute testing if a private class's method was called
没有太多测试经验,试图通过测试我最近创建的库来改变它。
将 nunit 与 nsubstitute 结合使用。
所以我的情况是 class 这样的:
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 并使 属性 internal 在这里是正确的,但几个小时前我不知道 InternalsVisibleToAttribute
的存在所以认为最好问:)
要回答确切的问题,您可以使用反射来访问私有成员,但这是一个脆弱且相当缓慢的解决方案。
我能给你的最好建议是私人的东西应该保密;通过其 public 接口 测试对象的行为。因此,如果太大且难以测试,只需将其重构为可测试即可。想想单一职责原则和控制反转原则。
编辑 1.:您可能正在寻找 依赖注入 的概念。大多数时候这应该没问题;然而,当我们谈论高度可重用的库时(你提到你正在制作一个库),其他解决方案可能更适合你的库的用户(例如创建一个 Facade 或重新考虑你的设计)。
没有太多测试经验,试图通过测试我最近创建的库来改变它。
将 nunit 与 nsubstitute 结合使用。
所以我的情况是 class 这样的:
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 并使 属性 internal 在这里是正确的,但几个小时前我不知道 InternalsVisibleToAttribute
的存在所以认为最好问:)
要回答确切的问题,您可以使用反射来访问私有成员,但这是一个脆弱且相当缓慢的解决方案。
我能给你的最好建议是私人的东西应该保密;通过其 public 接口 测试对象的行为。因此,如果太大且难以测试,只需将其重构为可测试即可。想想单一职责原则和控制反转原则。
编辑 1.:您可能正在寻找 依赖注入 的概念。大多数时候这应该没问题;然而,当我们谈论高度可重用的库时(你提到你正在制作一个库),其他解决方案可能更适合你的库的用户(例如创建一个 Facade 或重新考虑你的设计)。