当我发现自己想要测试具有小型公共API和复杂内部调用结构的类的私有函数时,我似乎最终选择了以下两种方法:
我觉得直接测试私有函数会使类不那么容易重构和测试更脆弱但是通过公共API测试私有函数并仅通过名称和正确的参数值绑定它们也感觉有点粗制滥造。
在没有做正确的TDD的情况下,是否有一套规则要遵守?我没有选择,因为我正在回顾过去写测试。
答案 0 :(得分:2)
您不关心正在测试的私有方法。您只关心正在测试的公共API。对于私有方法,所有重要的是它如何影响对象的可见行为。
如果你有一些公共API的行为,它是作为私有方法实现的,那么该测试可能会通过API方法的参数“定位”私有方法。这不是BadThing本身 - 它涵盖了公共API真实行为的真实测试用例。在稍后阶段,您可能决定以某种方式重构您的类,以便以其他方式实现相同的行为。重要的是测试封装了公共API的行为。
然后可能会将私有方法提取到其自己的类中,并且该方法将成为新类的公共API的一部分。那也没关系。您的新类成为旧类的依赖项,然后您可以使用DI来解除触发依赖项行为与实际测试用例的复杂性。这也很好,只要新课程有一个明确的理由存在,而不只是服务于第一堂课。
这一切都归结为你所看到的代码最好的东西 - 完全捕获原始API的行为而不必嘲弄模拟依赖项是否有意义?在一个理想的世界中,情况可能总是如此,但随着您的API变得更大或更复杂或更高级别,可能会导致其自身的问题。
要记住的重要一点是,您的测试从不测试私有方法。他们始终测试被测系统的可见行为,可能(或可能不)根据一个或多个私有方法实施。