gpt4 book ai didi

c++ - Google 测试框架不打印 std::optional

转载 作者:行者123 更新时间:2023-12-01 14:24:49 26 4
gpt4 key购买 nike

我有一个正在通知监听器的数据结构。在它的众多变量中,它有一个可选的 double 表示一个角度:

struct Data
{
// ...other data fields
std::optional<double> angle;
// ...other data fields
};
我想检查是否正在使用正确的 angle 调用监听器.我正在使用 谷歌测试框架 ,所以我在这里定义了我自己的匹配器:
MATCHER_P( HasAngle, angle, "" )
{
if ( !arg.angle.has_value( ) )
{
return false;
}

return arg.angle.value( ) == angle;
}
并检查我的听众是否以预期值被调用。
EXPECT_CALL( listener, on_event( HasAngle( 45.0 ) ) ).Times( AtLeast( 1 ) );
最终没有使用预期值调用监听器,但打印输出确实无法读取:
  Expected arg #0: has angle 45
Actual: 128-byte object <75-85 4D-52 FB-21 F9-BF 47-D9 48-53 FB-21 09-C0 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 01-17 23-83 FD-7F 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00>
实际值(value)难以理解。我没想到框架默认不支持 C++17 类型,所以我开始阅读 Google 测试框架手册 我尝试添加我自己的 PrintTo像这样重载:
void
PrintTo( const std::optional< double >& opt, std::ostream* os )
{
if ( !opt )
{
*os << "std::nullopt";
}
else
{
*os << *opt;
}
}
不用说,它没有帮助。我非常确定的是,因为输出状态 128-byte object它正在尝试打印鞋底 std::optional<double>而不是整个 struct Data ,它比那个大得多,但尽管过载 PrintTo 并没有成功.

最佳答案

GoogleTest 确实会打印 std::optional值,如果您使用 Optional(m) 匹配器。
示例测试:

TEST_F(MyClassTests, myFunctionTest)
{
std::optional<std::string> actual_value = "foo";
std::string expected_value = "bar";

EXPECT_THAT(actual_value, testing::Optional(expected_value));
}
输出将类似,但在神秘的 128-byte object <75-85 4D-52 FB-21 F9-BF... 之后文本,包含的值将被额外打印:
...
[ RUN ] MyClassTests.myFunctionTest
myclasstests.cpp:123: Failure
Value of: actual_value
Expected: value is equal to "bar"
Actual: 40-byte object <DE-AD BE-EF CA-FE BA-BE ...>, whose value "foo" doesn't match
[ FAILED ] MyClassTests.myFunctionTest (0 ms)
...

如果您希望收到 std::optional成为 std::nullopt在测试用例中,您很可能会这样做:
EXPECT_EQ(actual_value, std::nullopt);
测试将失败,如果 actual_value其实是有值(value)的。但同样,不会打印实际值。作为一种解决方法,您可以像这样实现测试:
if (actual_value) {
FAIL() << "actual_value is not std::nullopt, but: " << actual_value.value();
}

关于c++ - Google 测试框架不打印 std::optional,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63576783/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com