如何为 std 枚举实现 googletest 的自定义值打印机

问题描述 投票:0回答:1

我想要一个用于

std::future_status
枚举的值打印机。 基本上是比这更好的错误消息:

[ RUN      ] BasicTest.AssertNotEqualFutureStatus
Expected equality of these values:
  a
    Which is: 4-byte object <00-00 00-00>
  b
    Which is: 4-byte object <01-00 00-00>

通常只需实施

PrintTo
<<
即可做到这一点。 参考:https://github.com/google/googletest/blob/main/docs/advanced.md#teaching-googletest-how-to-print-your-values枚举类的GoogleTest测试错误打印

问题在于扩展

std
命名空间是未定义的行为。 我不想在这个输出之后打印它,这可以用
<<
SCOPED_TRACE
来完成。

代码

TEST(setup_test_case, testWillPass)
{
  auto a = std::future_status::ready;
  auto b = std::future_status::timeout;
  EXPECT_EQ(a, b);
}

https://godbolt.org/z/fqPnnh9x1

有没有办法在没有 UB 的情况下从 googletest 扩展价值打印机?

c++ std googletest
1个回答
0
投票

GoogleTest 并不真正支持与类型不同的命名空间中的自定义打印函数。话虽这么说,如果您真的愿意,您可以通过专业化来做到这一点: testing::internal::UniversalPrinter<T>

输出:

#include "gtest/gtest.h"
#include "gtest/gtest-printers.h"
#include <future>

namespace testing::internal {

template <>
class UniversalPrinter<std::future_status> {
public:
    static void Print(const std::future_status& val, ::std::ostream* os) {
        *os << static_cast<int>(val);
    }
};

}

int main()
{
  auto a = std::future_status::ready;
  auto b = std::future_status::timeout;
  EXPECT_EQ(a, b);
}

神箭链接

当然,由于这是处理 GoogleTest 内部类,因此它可能会在 GoogleTest 的未来版本中停止工作(/app/example.cpp:21: Failure Expected equality of these values: a Which is: 0 b Which is: 1 命名空间中的任何内容都可能会在没有警告的情况下发生更改)。


© www.soinside.com 2019 - 2024. All rights reserved.