2013-06-27 2 views
1

Извините за плохой заголовок, я понятия не имею, как назвать этот вопрос. Пожалуйста, отредактируйте и сделайте это лучше.Qt Test QVERIFY2() string и int concatenation

Я пишу тест с использованием оболочки 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)’ 

Что я делаю неправильно? Как я могу написать это правильно?

+0

Он хочет const char *, а не QString ... – Huy

+0

Выход, который вы вставили, выглядит очень подозрительно - а именно, открывающий круглый кронштейн 'FAIL! : PathTester :: testPath() '('<- здесь. Действительно ли это так? Кроме того, что означает' expectedNum' в этой точке (выгружать его непосредственно перед проверкой), и почему это не так? сам? – peppe

+0

@peppe Вы правы, это было подозрительно. Это '(' не было в коде (должно быть, это было непреднамеренно?) К счастью, когда я вернулся, чтобы посмотреть на оригинал, я понял, что читаю вывод из копии/вставленной строки, которая не была обновлена ​​с помощью 'QString :: number()' \ * sigh \ *. Похоже, это был аппаратный сбой между стулом и клавиатурой :-) Это один из тех дней. .. Я удалил бескорыстность из вопроса. Еще раз спасибо за вашу помощь –

ответ

8

При использовании QString используйте QVERIFY2(condition, qPrintable(...)).

Второй аргумент должен быть a 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)? В случае отказа он испустит ожидаемое значение и фактическое значение.

+0

Я не знал о QCOMPARE, так что спасибо! Я буду использовать это. –

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)); 

Таким образом, вы получите более читаемый код и может изменять как фактическое количество и ожидаемые выражения подсчета.