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 或重新考虑你的设计)。