C++ Qt Test QVERIFY2()字符串和int串联

C++ Qt Test QVERIFY2()字符串和int串联,c++,qt,unit-testing,qt4,qtestlib,C++,Qt,Unit Testing,Qt4,Qtestlib,很抱歉标题不好,我不知道如何命名这个问题。请编辑并使其更好 我正在使用Qt测试框架编写一个测试,并试图编写一些有用的输出供QVERIFY2()宏使用。以下所有语句都未能编译,错误消息大致相同: QVERIFY2( spy.count() == 1, "Emitted signal pathChanged() was emitted " + spy.count() + " times instead of 1 time" ); QVERIFY2( spy.count() == 1, QString

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

我正在使用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)’
我做错了什么?如何才能正确编写?

使用QString时使用
QVERIFY2(条件,qPrintable(…)

第二个参数必须是
常量char*
。在所有情况下,您都在创建一个QString——这确实非常方便,因为它允许您使用
+
进行串联,或者
QString::arg()
,等等;您需要转换到
char*
,这不是隐式的,这就是
qPrintable()
所做的

详细说明:
qPrintable(string)
string.toLocal8Bit().constData()的缩写。Qt5.4还将引入
qUtf8Printable(string)
,它相当于
string.toUtf8().constData()


附录:除了传递给
QVERIFY2
的技术问题之外,为什么不使用
QCOMPARE(spy.count(),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)));

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

它需要的是常量字符*而不是QString…您粘贴的输出看起来非常可疑--即,开头的圆括号
失败!:PathTester::testPath()'(
@peppe你说得对,这很可疑。
不在代码中(一定是无意中添加的???)幸运的是,当我回去查看原始文件时,我意识到我正在读取未使用
QString::number()更新的复制/粘贴行的输出
*叹气*。看起来是椅子和键盘之间的硬件故障:-)这是其中的一天…我从问题中去掉了愚蠢。再次感谢您的帮助