Извините за плохой заголовок, я понятия не имею, как озаглавить этот вопрос. Пожалуйста, отредактируйте и сделайте это лучше.
Я пишу тест, используя тестовую среду 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)’
Что я делаю неправильно? Как я могу написать это правильно?
использование QVERIFY2(condition, qPrintable(...))
при использовании QString.
Второй аргумент должно быть const char *
, Во всех ваших случаях вместо этого вы создаете QString — что действительно очень удобно, поскольку позволяет вам использовать +
для объединения или QString::arg()
, так далее; вам нужно преобразование в char *
, который не является неявным, и вот что qPrintable()
делает.
Разработать: qPrintable(string)
это сокращение для string.toLocal8Bit().constData()
, Qt 5.4 также представит qUtf8Printable(string)
что эквивалентно string.toUtf8().constData()
,
Приложение: кроме того, что нужно передать QVERIFY2
почему ты не используешь QCOMPARE(spy.count(), 1)
? В случае отказа он выдаст ожидаемое значение и фактическое значение.
Я хотел бы добавить свои 5 центов. Хотя вы действительно можете использовать QCOMPARE в вашем конкретном случае, как предложено @peppe, иногда вам может потребоваться предоставить более подробное сообщение. Это дело для QVERIFY2. Насколько мне известно, лучший способ форматирования сообщения в этом случае — использование метода QString :: arg (). Например, в вашем случае вы можете написать:
QVERIFY2 (
spy.count() == 1,
QString ("Emitted signal pathChanged() was emitted %1 times instead of %2 time(s)")
.arg (spy.count())
.arg (1));
Таким образом, вы получите более читаемый код и можете изменить как фактическое, так и ожидаемое количество выражений.