如何在GoogleTest框架中漂亮地打印QString?

14
我正在与Qt5应用程序一起使用GoogleTest (GTest)框架。
每当使用QString参数时,如果测试失败,该框架会尝试打印所有涉及的值。然而,它无法自动处理外部类型(在这种情况下是Qt5的QString)。
QString test = "Test";
ASSERT_EQ(test, "Value");

enter image description here

我该如何让GoogleTest自动漂亮地打印QString(而不必每次手动转换)?
1个回答

22
谷歌测试指南解释了如何通常教授框架处理自定义类型。
最后,只需添加以下代码片段,GoogleTest就能够使用QString:
QT_BEGIN_NAMESPACE
inline void PrintTo(const QString &qString, ::std::ostream *os)
{
    *os << qUtf8Printable(qString);
}
QT_END_NAMESPACE

这段代码必须不在测试夹具的命名空间中,而必须在Qt命名空间(或通常是定义要漂亮打印的类型的命名空间)中。此代码还必须从调用特定类型的GoogleTest断言的所有翻译单元中可见,否则它将不会被使用(请参见注释)。
因此,GoogleTest现在可以漂亮地打印QString: enter image description here 当然,您也可以添加一些引号,以使其更清晰地来自QString:
*os << "\"" << qUtf8Printable(qString) << "\"";

来源:Justin Noel,高级咨询工程师的网络研讨会ICS Qt测试驱动开发使用Google测试和Google模拟


1
另一个提示:如果您还想在字符串中打印Unicode字符,请使用qUtf8PrintableqPrintable会转换为“本地8位”,可能不是Unicode干净的,特别是在Windows上);如果您想打印QString并转义非可打印字符,则可以通过QDebug(可能在托管QByteArrayQBuffer上操作)进行。 - peppe
2
我无法让它工作。有趣的是,如果我定义两个PrintTo函数(一个使用QString&,另一个使用常规QString),我会得到编译器错误“error C2668:'PrintTo':多重载函数的模糊调用可以是'void PrintTo(const QString,std :: ostream *)'或'void PrintTo(const QString&,std :: ostream *)'”,但是如果只有一个似乎从未调用它...这是什么魔法酱? - gremwell
3
@Gremwell,我也曾遇到这个问题,但是这个问题的答案在这里得到了解决:https://dev59.com/bmAf5IYBdhLWcg3wbCJ3 - Eelke
@Eelke 我也遇到了翻译单元的同样问题。我已经相应地编辑了答案。 - fkorsa
这个机制非常烦人,因为它非常脆弱,名称查找无法真正调试。我有一个针对QColor和另一个针对QString的PrintTo()函数,在同一编译单元中定义。QString的重载被调用,而QColor的重载没有被调用。我不知道为什么。 - Knitschi
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接