【问题标题】:C++ Unit testing: Changing member scopeC++ 单元测试:更改成员范围
【发布时间】:2016-08-19 19:21:30
【问题描述】:

我正在为我的班级编写单元测试,并且想练习私有方法。我正在做这样的事情:

class MyClass {
    Myclass() {}
    ~MyClass() {}
#ifdef TESTING
public:
#else
private:
#endif
    void MyMethod1();
    void MyMethod2();
};

如果定义了TESTING,我会更改类签名以公开所有内容。在我的测试代码中,我只是做这样的事情:

#define TESTING
#include "MyClass.h"
void MyTestMethod()
{
    MyClass mc;
    mc.MyMethod1(); // Now I can access MyMethod1
}

所以它只在我的测试文件中公开,而不是在其他任何地方。我的测试可执行文件看到一个标题,该标题描述了一个完全公开的类。该类的代码实际上是在其他地方构建的(未定义TESTING),因此当测试项目链接到库时,范围会有所不同。

这有可能破坏任何东西吗?我担心如果标头与目标文件中实际生成的不同,这可能会改变 vtables 的位置或编译器和链接器的期望。

【问题讨论】:

    标签: c++ unit-testing


    【解决方案1】:

    您可能会遇到低质量的测试。测试与类的实际功能无关的一些实现细节的测试。测试公共接口只会推动您走向良好的设计和测试用例,这些用例可以经受住代码重构而不会中断。

    【讨论】:

      【解决方案2】:

      丑陋,虽然有可能但不要那样做,而是为您的测试创建一个包装类并在 MyClass 中使用 friend TestClass; 关键字。

      【讨论】:

      • 我想过这样做,但是当您现在必须更改两个方法签名而不是一个时,重构代码变得很困难。使用我描述的方法,您可以减少更改和维护的类。
      • Martin 指出的是 100% 正确,但是如果您仍然需要这样做。您可以创建两个版本的 MyClass,它们具有相同的名称但位于不同的命名空间中,并且具有相同的实现但不同的访问修饰符,然后您可以使用预处理器指令并在一行中选择要使用的正确命名空间。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 2012-03-02
      • 1970-01-01
      • 2015-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多