ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 单元测试复制构造和赋值运算符

2019-07-28 09:13:32  阅读:171  来源: 互联网

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


我正在为几个类(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,unit-testing,assignment-operator,copy-constructor
来源: https://codeday.me/bug/20190728/1560181.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有