- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在单元测试代码中,在新成员可能已添加到类的假设下,哪种测试operator==
比较运算符的最佳方法?
例如:
struct A {
int a, b;
bool operator==( const A& other ) const { return( a == other.a && b == other.b ); }
};
int Test() {
A a1, a2;
EXPECT_TRUE( a1 == a2 );
}
然后我们更改A,添加一个新的成员变量c
。使用当前的测试/比较运算符,当 c
不同时,我们将得到假阴性。
是否有替代/低级别的方法来比较两个对象?
最佳答案
当测试你的operator==
时,你应该检查两件事:
当对象相等时返回true
。
当对象不相等时返回false
。
正如您正确观察到的那样,当有人添加更多成员但忘记更新 operator==
定义时,条件 1 将不受影响。这就是为什么第二个标准很重要。请注意,现在,通过将 operator==
实现为 return true;
,您的测试将通过。
因此,您可能希望您的测试形状如下:
int Test() {
A a12{1, 2};
A a12_{1, 2};
A a23{2, 3};
EXPECT_TRUE( a12 == a12 );
EXPECT_TRUE( a12 == a12_ );
EXPECT_FALSE( a12 == a23 );
EXPECT_FALSE( a23 == a12 );
}
现在,给定这段代码,添加成员 c
的人也可能会忘记更新测试并且没有任何事情会失败(注意:如果 A
有一个构造函数而不是一个聚合,测试将无法构建,这不是问题,但问题包含一个聚合)。有一定程度的无能是你无法防范的。另请注意,也许您不希望c
有助于比较(如果它是例如std::mutex
怎么办?)- 这取决于关于您对(不)平等的定义。
总的来说,不要试图预测 future ,这通常是白费力气而且不会奏效(尽管你会主要记住它计算出来的时间)。
关于c++ - 在单元测试中,如何在不使用运算符== 的情况下比较两个对象,这可能会错过新成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59093114/
java.lang.Throwable 的哪些子类可能被空语句抛出? 通过短语“空语句”,我指的是“无”、“分号”和“分号”: // .... A(); B(); C(); try { //
我是一名优秀的程序员,十分优秀!