Nsubstitute测试是否调用了私有类的方法

问题描述 投票:0回答:1

没有太多的测试经验,试图通过测试我最近制作的库来改变它。

使用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的存在所以最好问:)

c# mocking nsubstitute
1个回答
3
投票

要回答确切的问题,您可以使用反射来联系私人成员,但这是一个脆弱而缓慢的解决方案。

我能给你的最好建议是私人物品应该保密;通过公共接口测试对象的行为。因此,如果太大而且难以测试,只需将其重构为可测试的。考虑单一责任原则和控制原则反转。

编辑1:您可能正在寻找依赖注入的概念。大多数时候这应该没问题;然而,当我们谈论高度可重用的库(你提到你正在创建一个lib)时,其他解决方案可能更适合你的库用户(例如创建一个Facade或重新思考你的设计)。

© www.soinside.com 2019 - 2024. All rights reserved.