我有一个自定义聚合模板类型,我试图使用gtest测试。我正在使用TYPED_TEST_P,并测试各种类型。它工作正常,直到我尝试做布尔类型。我得到以下“错误”
error: Value of: const_img.at(pt.x,pt.y)
Actual: true
Expected: *buffer
Which is: true
所以这就是说有一个错误:true!= true。有人以前看过这个问题吗?你是如何解决的?
我不能在这里发布所有代码,但是:
捕获非错误的调用是:
ASSERT_EQ(*buffer,const_img.at(pt.x,pt.y))
TypeParam
是bool
的typedef,由Google Test基于TYPED_TEST_P
提供。 buffer
具有以下类型:
const TypeParam* buffer;
const_image
是一个const Image<TypeParam>&
(自定义类),它强制at
成为const重载,占用空间:
const TypeParam& at(ptrdiff_t col,ptrdiff_t row) const;
显然,这是返回正确的值(true应该等于true),并且永远不会达到以下if语句的断点:
if (*buffer != const_img.at(pt.x,pt.y))
{
std::cout << "here" << std::endl;
}
如果我跳过测试const重载,我没有错误(这很奇怪)。
编辑:解决方法
以下工作有效,但是......愚蠢。
TypeParam a = const_img.at(pt.x,pt.y);
TypeParam b = *buffer;
ASSERT_EQ(
a,b);
答案 0 :(得分:2)
您的值是否有可能在int
宏的扩展中的某处转换为ASSERT_EQ
?
如果您尝试以下操作会怎样,以确保*buffer
和at(..)
的值被视为bool
?听起来bool
是唯一出现此问题的类型参数。
ASSERT_EQ(static_cast<TypeParam>(*buffer),
static_cast<TypeParam>(const_img.at(pt.x,pt.y)));
在Google Test v 1.7(gtest.cc
,第1114行)中查看以下签名时出现了这种担忧:
// The helper function for {ASSERT|EXPECT}_EQ with int or enum
// arguments.
AssertionResult CmpHelperEQ(const char* expected_expression,
const char* actual_expression,
BiggestInt expected,
BiggestInt actual) {
// ...
编辑:
如果您希望这样做,您应该能够使用以下内容:
#include <functional> // std::equal_to
// ...
EXPECT_PRED2(std::equal_to<Pixel_t>(), *buffer, const_img.at(pt.x,pt.y));
这将应用arity-2比较仿函数。 Google Test还会在发生故障时打印您的个人论点及其价值,这样您就不会失去功能。
不幸的是,这个答案并不能解释原始问题中发生了什么。我自己尝试观察这个问题,这会使故障排除变得更容易,但是使用Apple LLVM 5.0和Gtest 1.6的最小测试用例并没有看到它。
答案 1 :(得分:0)
{EXPECT_EQ(,)}在内部将bool转换为int或其他一些数字类型。 c ++标准说bool when false表示为0,但是当为true时用其他数字表示为0.这意味着在你的情况下: {EXPECT_EQ(true,true)} 可以在内部评估为: {EXPECT_EQ(4,1)} 这种比较失败了。