使用友元类与在C++中添加访问器进行单元测试?

bia*_*ias 11 c++ unit-testing friend-class

添加返回对象内部状态的函数进行单元测试是否更好,而不是让测试类成为朋友? - 尤其是当除了单元测试的情况之外没有用于功能的情况.

Dre*_*ins 12

单元测试应该在95%的时间内仅测试公开暴露的类表面.如果您正在测试一些内容,那就是测试实现细节,这本身就很脆弱,因为您应该能够轻松地更改实现并仍然可以使测试工作.它不仅易碎,而且还可能会尝试测试在计划使用场景中实际上不可能的事情,这是浪费时间.

如果要添加的访问器的目的只是为了测试函数是否具有所需的效果,那么您的类设计可能会违反另一个原则,即类似状态机的类应该始终清楚它的状态,如果这会影响人们与班级互动时会发生什么.在这种情况下,提供那些只读访问器是正确的.如果它不影响类的行为,请参考我之前关于实现细节的内容.

正如你正确地说的那样,由于其自​​身的原因,使用未使用过的东西弄乱一个班级的公共表面也是不可取的.

如果我必须在您的案例中选择访问者和朋友,我会选择朋友,只是因为您拥有自己的测试并且可以在紧要关头改变它.您可能没有找到使用额外存取器的方法的小丑拥有代码,然后您将被卡住.


Dar*_*ryl 9

我不同意接受的答案,而是推荐使用朋友类.

您正在测试的州的一部分可能特定于您的班级的实施; 您正在测试其他代码通常不了解或不关心的细节,也不应该依赖.公共访问器函数使这些实现细节成为类接口的一部分.如果您正在测试的内部状态不是预期接口的一部分,则不应通过公共功能看到它.从纯粹主义的角度来看,你被困在两个错误的答案之间,因为朋友类在技术上也是公共界面的一部分.在我看来,问题就变成了,哪种选择不太可能导致糟糕的编码选择?使用一组依赖于实现的公共访问器函数将无意中鼓励依赖于实现的类的概念模型,从而导致依赖于实现的类的使用.一个适当命名和记录的单个朋友类不太可能被滥用.

虽然总的来说我非常赞同更喜欢访问者函数而不是直接访问成员变量的建议,但我不同意这种最佳实践适用于依赖于实现的内部状态的单元测试.合理的中间立场是使用私有访问器功能来处理您的单元测试所关注的那些状态,并且足够严格以在单元测试中使用访问器功能.只是我的观点.