【问题标题】:How to pretty-print QString with GoogleTest framework?如何使用 GoogleTest 框架漂亮地打印 QString?
【发布时间】:2017-03-04 15:28:16
【问题描述】:

我将 GoogleTest (GTest) 框架与 Qt5 应用程序结合使用。

当使用 QString 参数的测试失败时,框架会尝试打印所有涉及的值。但是,它不能自动处理外来类型(本例中为 Qt5 的 QString)。

QString test = "Test";
ASSERT_EQ(test, "Value");

如何让 GoogleTest 自动漂亮地打印 QStrings(= 而不必每次都手动转换它们)?

【问题讨论】:

    标签: qt qt5 googletest pretty-print qstring


    【解决方案1】:

    GoogleTest Guide 解释了您一般如何使用teach the framework 处理自定义类型。

    最后,只需添加以下代码 sn-p 即可让 GoogleTest 能够使用 QStrings:

    QT_BEGIN_NAMESPACE
    inline void PrintTo(const QString &qString, ::std::ostream *os)
    {
        *os << qUtf8Printable(qString);
    }
    QT_END_NAMESPACE
    

    此代码不得在测试装置的命名空间中,但必须在 Qt 命名空间中(或者通常在定义了应该打印的类型的命名空间中)。 此代码还必须可以从您调用该特定类型的 GoogleTest 断言的所有翻译单元中查看,否则将不会被使用(请参阅 cmets)。

    因此,GoogleTest 现在可以漂亮地打印 QStrings:

    当然你也可以加一些引号来更清楚地表明它来自一个QString:

    *os << "\"" << qUtf8Printable(qString) << "\"";
    

    来源:网络研讨会ICS Qt Test-Driven Development Using Google Test and Google Mock,高级咨询工程师贾斯汀·诺尔(Justin Noel)

    【讨论】:

    • 其他一些提示:如果您还想在字符串中打印 Unicode 字符,请使用 qUtf8PrintableqPrintable 转换为“本地 8 位”,这可能不是 Unicode 干净的,尤其是在 Windows 上);如果您想打印QStrings 并转义不可打印的字符,请通过QDebug(可能作用于QBuffer,托管QByteArray)。
    • 我无法让它工作。有趣的是,如果我定义了两个 PrintTo 函数(一个采用 QString&,一个采用常规 QString),我会得到一个编译器错误error C2668: 'PrintTo': ambiguous call to overloaded function could be 'void PrintTo(const QString,std::ostream *)' or 'void PrintTo(const QString &amp;,std::ostream *)' 但是如果我只有一个似乎永远不会调用它......什么是神奇的酱汁?
    • @gremwell 您是否确保 PrintTo 不在您的应用程序命名空间中?除了我不知道酱汁可能是什么。我只是在同一个 CPP 文件中声明我的第一个夹具之前将这些行放在它上面,它就可以工作(QT 5.7 和最新的 GoogleTest)。
    • @Gremwell,我也在为此苦苦挣扎,但这个问题的答案为我解决了这个问题stackoverflow.com/questions/24673515/…
    • @Eelke 我在翻译单元上遇到了同样的问题。我已经相应地编辑了答案。
    猜你喜欢
    • 2013-10-03
    • 2011-08-05
    • 2010-12-26
    • 2015-01-22
    • 1970-01-01
    相关资源
    最近更新 更多