提问人:kfsopdf 提问时间:11/7/2023 最后编辑:273Kkfsopdf 更新时间:11/8/2023 访问量:103
在我的相等性单元测试中,为什么一个指针指向内存插槽而不是内存中的项?
In my unit test for equality, why does one pointer point to a memory slot rather than the item in memory?
问:
所以我正在运行一个单元测试:
ASSERT_EQ(mifid_trade_report.contingent_transaction_flag, "CONT");
上面还有很多内容,但我删掉了其余部分,因为它指向许多类和文件。
这是我在运行测试时返回的错误消息:
/home/.../test_protocol.cpp:2075: Failure
Expected equality of these values:
mifid_trade_report.contingent_transaction_flag
Which is:
"CONT"
Which is: 0x563717b6bffe
两个问题:
我理解上面的错误消息是指向的,而指向内存插槽是正确的吗?
mifid_trade_report.contingent_transaction_flag
CONT
CONT
0x563717b6bffe
如果 1.没错,为什么它指向内存插槽而不是对象?
我已经复制了其他单元测试的模式完全相同,但其他单元测试没有相同的问题。
答:
2赞
Louis Go
11/8/2023
#1
ASSERT_STREQ(ptr1,ptr2)
是你需要的。它有助于比较以 nul 结尾的 C 样式字符串内容。 将检查指针本身,因为 a 只是指向 C 字符串的开头。ASSERT_EQ
char*
还有其他方法。通过将以 nul 结尾的字符串设置到一个重载的容器中。例如: 和==
std::string
std::string_view
#include <gtest/gtest.h>
#include <string_view>
#include <string>
#include <fmt/format.h>
TEST(Foo,Bar){
const char* cstring = "foo";
ASSERT_STREQ(cstring, "foo");
ASSERT_EQ(std::string(cstring), "foo");
ASSERT_EQ(std::string_view(cstring), "foo");
}
此外,googletest 官方文档确实会引导您进入 api*_STREQ
报价:
EXPECT_EQ
EXPECT_EQ(val1,val2) ASSERT_EQ(val1,val2)
验证 val1==val2. 指针上的指针是否相等。如果用于两个 C 字符串,它会测试它们是否位于同一内存位置,而不是它们是否具有相同的值。使用 EXPECT_STREQ 按值比较 C 字符串(例如 const char*)。
将指针与 NULL 进行比较时,请使用 EXPECT_EQ(ptr, nullptr) 而不是 EXPECT_EQ(ptr, NULL)。
评论
mifid_trade_report.contingent_transaction_flag
contingent_transaction_flag
const char*
char contingent_transaction_flag[4];
"CONT"
"true" == "true"
true
false