2

抱歉标题不好,我不知道如何命名这个问题。请编辑并使其变得更好。

我正在使用 Qt 测试框架编写测试,并且正在尝试编写一些有用的输出以供QVERIFY2()宏使用。以下所有语句都未能通过大致相同的错误消息进行编译:

QVERIFY2( spy.count() == 1, "Emitted signal pathChanged() was emitted " + spy.count() + " times instead of 1 time" );
QVERIFY2( spy.count() == 1, QString( "Emitted signal pathChanged() was emitted " ) + QString( spy.count() ) + QString( " times instead of 1 time" ) );
QVERIFY2( spy.count() == 1, "Emitted signal pathChanged() was emitted " + QString( spy.count() ) + " times instead of 1 time" );

最后一次尝试的错误消息是:

PathTester.cxx: In member function ‘void PathTester::testReservePath()’:
PathTester.cxx:241:128: error: cannot convert ‘QString’ to ‘const char*’ for argument ‘3’ to ‘bool QTest::qVerify(bool, const char*, const char*, const char*, int)’
PathTester.cxx:241:243: error: cannot convert ‘QString’ to ‘const char*’ for argument ‘3’ to ‘bool QTest::qVerify(bool, const char*, const char*, const char*, int)’

我究竟做错了什么?我怎样才能正确地写出来?

4

2 回答 2

9

使用QVERIFY2(condition, qPrintable(...))QString 时使用。

第二个参数必须是a const char *。在所有情况下,您都在创建一个 QString ——这确实非常方便,因为它允许您+用于连接,或QString::arg()等;您需要转换为char *,这不是隐式的,就是qPrintable()这样。

详细说明:qPrintable(string)string.toLocal8Bit().constData(). Qt 5.4 还将介绍qUtf8Printable(string)which 等价于string.toUtf8().constData().

附录:除了传递给什么的技术性之外,QVERIFY2你为什么不使用QCOMPARE(spy.count(), 1)?如果失败,它将发出期望值和实际值。

于 2013-06-27T22:07:54.630 回答
1

我想加我的 5 美分。虽然您实际上可以按照@peppe 的建议在您的特定情况下使用 QCOMPARE,但有时您可能需要提供更详细的消息。QVERIFY2 就是这种情况。我知道在这种情况下格式化消息的最佳方法是利用 QString::arg() 方法。例如,在您的情况下,您可以编写:

QVERIFY2 (
    spy.count() == 1, 
    qPrintable (
        QString ("Emitted signal pathChanged() was emitted %1 times instead of %2 time(s)")
        .arg (spy.count())
        .arg (1)));

通过这种方式,您可以获得更易读的代码,并且可以更改实际计数和预期计数表达式。

于 2017-01-24T04:45:28.287 回答