c++ - 单元测试拷贝构造函数和赋值运算符

标签 c++ unit-testing copy-constructor assignment-operator

我正在为几个类 (C++) 编写单元测试,在尝试为复制构造函数和赋值运算符编写单元测试时遇到了一个问题。 两者都可能出错的一个基本问题是,程序员向类添加了一个成员,然后忘记更新 c'ctor 和/或 operator=。

我当然可以按照以下方式编写单元测试:

class MyClass()
{
public:

    int a, b;
    non_trivial_copyable nasty;

    MyClass& operator=(const MyClass& _r)
    {
        if(this == &r)
          return *this;
        a = _r.a;
        b = _r.b;
        nasty = acquire_non_trivial_copyable();
    }
};


TEST(My_Class_copy_op)
{
  MyClass m1;
  m1.a = m1.b = 2;

  MyClass m2 = m1;
  VERIFY(m2.a == 2);
  VERIFY(m2.b == 2);
}

很好。 现在程序员添加了一个成员 c,但不更新运算符和测试用例。

class MyClass()
{
public:
    float c;
// ...
}

测试用例仍然会成功,即使运算符现在坏了。

现在,我们可以执行以下操作:

TEST(My_Class_copy_op)
{
// Aha! Fails when programmer forgets to update test case to include checking c
   static_assert(sizeof(MyClass) == 8);
// Meh, also fails on an architecture where the size of MyClass happens to be != 8

   // ...
}

我找不到任何关于如何解决这个问题的好信息,但肯定有人以前遇到过这个问题!? 是如此明显以至于我完全错过了它!?

最佳答案

显式测试复制构造函数很好,但它可能绕着灌木丛打转。更常见的情况是,复制构造函数本身是一个不需要显式测试的细节。您可能想要做的是编写一套测试,对您复制的对象进行工作,并确保工作产生正确的结果。像这样:

MyClass a;
// Now initialize a with stuff it needs to do its job

// Copy a into b
MyClass b = a;

// Make b do its job and make sure it succeeds
VERIFY(b.DoWork());

关于c++ - 单元测试拷贝构造函数和赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27805582/

相关文章:

c++ - 创建不可复制对象的 vector

c++ - 无法追踪大量内存使用的来源

c++ - 使用嵌套类时不完整/未定义的类型

c++ - 没有标准方法来比较智能指针和常规指针?

c++ - 在结构的 STL 映射中,为什么 "[ ]"运算符会导致结构的 dtor 被额外调用 2 次?

c++ - 为什么 C++ 允许在具有指针成员的类中编译默认复制构造函数/赋值运算符重载?

c++ - 如何在 OpenGL 中创建调试标记?

unit-testing - Java 项目 : Failed to load ApplicationContext

c# - 是否有适用于 Silverlight 的 C# 动态模拟框架?

javascript - 如何测试返回匿名函数的node.js模块?