Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用friend类与在C+;中为单元测试添加访问器+;?_C++_Unit Testing_Friend Class - Fatal编程技术网

C++ 使用friend类与在C+;中为单元测试添加访问器+;?

C++ 使用friend类与在C+;中为单元测试添加访问器+;?,c++,unit-testing,friend-class,C++,Unit Testing,Friend Class,添加返回对象内部状态的函数进行单元测试是否比让测试类成为朋友更好特别是,除了单元测试之外,这些函数没有任何用处。我建议使用访问器,而不是允许通过公共成员或朋友类进行访问 我不认为使用friend类实际上会给你带来任何好处,它有可能让你的生活变得更糟。如果您的代码将停留很长一段时间,那么很有可能以您无法预料的方式使用它。访问函数现在可能只用于测试,但谁知道将来会发生什么呢?使用访问器而不是提供对变量的直接访问给了您更多的灵活性,而且成本非常低 另一个论点是使用访问者而不是公共成员是一个好习惯。培养

添加返回对象内部状态的函数进行单元测试是否比让测试类成为朋友更好特别是,除了单元测试之外,这些函数没有任何用处。

我建议使用访问器,而不是允许通过公共成员或朋友类进行访问

我不认为使用friend类实际上会给你带来任何好处,它有可能让你的生活变得更糟。如果您的代码将停留很长一段时间,那么很有可能以您无法预料的方式使用它。访问函数现在可能只用于测试,但谁知道将来会发生什么呢?使用访问器而不是提供对变量的直接访问给了您更多的灵活性,而且成本非常低


另一个论点是使用访问者而不是公共成员是一个好习惯。培养良好的习惯是程序员的一项重要技能

单元测试应该有95%的时间只测试一个类的公开表面。如果您正在测试一些隐藏的东西,那就是测试实现细节,这本身就是脆弱的,因为您应该能够轻松地更改实现,并且仍然可以让测试工作。它不仅是脆弱的,而且您还可能被诱惑去测试在计划使用场景中实际上不可能实现的事情,这是浪费时间

如果您想要添加的访问器只是为了测试函数是否达到预期效果,那么您的类设计可能会违反另一个原则,即类似于类的状态机应该始终明确其所处的状态,如果这会影响人们与类交互时发生的情况。在这种情况下,提供这些只读访问器是正确的。如果它不影响类的行为,请参阅我前面关于实现细节的部分

正如您正确地说的,由于自身的原因,用未使用的东西将类的公共表面弄乱也是不可取的


如果在你的情况下我必须在访问者和交友之间进行选择,我会选择交友,因为你拥有自己的测试,并且可以在必要时更改它。你可能不会拥有小丑的代码,因为小丑找到了使用额外访问器的方法,然后你就会被卡住。

我不同意接受的答案,而是建议使用friend类

您正在测试的部分状态可能特定于类的实现;您正在测试其他代码通常不知道或不关心且不应该依赖的细节。公共访问器函数使这些实现细节成为类接口的一部分。如果您正在测试的内部状态不是预期接口的一部分,那么它不应该通过公共函数可见。从纯粹主义者的角度来看,您陷入了两个错误答案之间,因为好友类在技术上也是公共接口的一部分。在我看来,问题变成了,哪种选择不太可能导致糟糕的编码选择?使用一组依赖于实现的公共访问器函数会无意中鼓励类的依赖于实现的概念模型,从而导致类的依赖于实现的使用。一个好友类,适当地命名和记录,不太可能被滥用


一般来说,我非常同意优先使用访问函数而不是直接访问成员变量的建议,但我不同意这种最佳实践适用于依赖于实现的内部状态的单元测试。一个合理的中间立场是,对单元测试将关心的那些状态使用私有访问器函数,并且在单元测试中使用访问器函数时要足够严格。只是我的意见。

让内部状态“受保护”怎么样?
然后使用派生类进行单元测试。

我认为,通过向用户提供访问器(如果这样做有意义的话)对类进行未来验证与改进可测试性之间需要有区别。我也不是一个纯粹为了测试而交朋友的人,因为这在我不喜欢的地方引入了紧密耦合

如果访问器的唯一用途是为测试用例提供一种检查类内部状态的方法,那么公开它们通常是没有意义的。它还可以限制您以后可能希望更改的实现细节,但随后发现您无法更改,因为其他人正在使用所述访问器


我的首选解决方案是提供受保护的访问器函数,以便向类的用户清楚地传达这些函数不是公共接口的一部分。然后,您的测试将创建原始类的最小派生类,该类包含父函数的调用存根,但也将访问器公开,以便您可以在测试用例中使用它们。

使用友元类进行单元测试是完全合法的,并允许您维护封装。您不应该仅仅为了使类更易于测试而修改类的公共接口。这样想吧。如果您购买了一个第三方FTP库,并且正在尝试使用它,而它的公共接口被一堆您甚至不需要知道的方法弄得乱七八糟,那该怎么办?仅仅因为单元测试!即使修改受保护的接口来补偿单元测试也是不好的。如果我是从某个类继承的,我不想担心哪些方法对我有用,哪些方法只因为单元测试才存在!!!使用friends类进行单元测试有助于维护简单、易于使用的类接口;它有助于保护封装和抽象

我听过这样的观点,即使用友元类进行单元测试是不好的,因为