2013-02-20 3 views
7

Я заявляю, что в мире QT C++. Я делаю TDD, используя класс QTest. Я хочу проверить, что в определенных условиях исключение вызывается моим тестируемым классом. Используя тест Google, я бы использовал что-то вроде:Как проверить с QTest, что выбрано исключение?

EXPECT_THROW(A(NULL), nullPointerException); 

Существует ли что-то подобное в QTest? О, по крайней мере, способ сделать это?

Спасибо!

+1

Исключения не очень распространены в мире qt. Для этого в QTest не существует определенного макроса afaik, но вы можете сделать блок catch try, чтобы проверить его с помощью QVERIFY. В качестве альтернативы вы также можете использовать google test с qt (что по нескольким причинам намного лучше, чем qtest imho) – TWE

+0

Да, к этому времени я понимаю, что gtest намного лучше, чем QTest. Благодаря! – Killrazor

+0

Кроме того, gtest поддерживает gmock, в то время как для QTest нет ничего подобного. QTest действительно предназначен для случайного использования, а не для хорошего UT. Единственное, что вам нужно от QTest, если вы используете gtest, - это QSignalSpy. Все остальные вещи намного лучше в gtest. – ixSci

ответ

10

С Qt5.3 QTest предоставляет макрос QVERIFY_EXCEPTION_THROWN, который обеспечивает отсутствующую функцию.

+0

Единственная проблема с этим заключается в том, что 'if not-substitutable type exception is throw или выражение вообще не генерирует исключение, тогда сбой будет записан в тесте log и тест больше не будет выполнен. '. Это означает, что практически нет готового решения, которое позволяет проверить, не что-то ** не выбрасывает ** данный тип исключения (или полученный). – rbaleksandar

5

Этот макрос демонстрирует принцип.

Сравнение является специальным прецедентом, поэтому может или не хотеть использовать его - он позволяет макросу «провалить» тест, даже если выбрано исключение из того, с которым вы тестируете. Часто вам это не нужно, но я все равно его бросил!

#define EXPECT_THROW(func, exceptionClass) \ 
{ \ 
    bool caught = false; \ 
    try { \ 
     (func); \ 
    } catch (exceptionClass& e) { \ 
     if (typeid(e) == typeid(exceptionClass)) { \ 
      cout << "Caught" << endl; \ 
     } else { \ 
      cout << "Derived exception caught" << endl; \ 
     } \ 
     caught = true; \ 
    } catch (...) {} \ 
    if (!caught) { cout << "Nothing thrown" << endl; } \ 
}; 

void throwBad() 
{ 
    throw std::bad_exception(); 
} 

void throwNothing() 
{ 
} 

int main() { 
    EXPECT_THROW(throwBad(), std::bad_exception) 
    EXPECT_THROW(throwBad(), std::exception) 
    EXPECT_THROW(throwNothing(), std::exception) 

    return EXIT_SUCCESS; 
} 

Возвращает:

Caught 
Derived exception caught 
Nothing thrown 

адаптировать его для QTest вам нужно будет, чтобы заставить неудачу с QFAIL.

+0

Почему вы не используете 'catch (const exceptionClass & e) {\ if (typeid (e) == typeid (exceptionClass)) {' быть независимым от std :: exception? – ixSci

+0

Потому что, если исключение не является или не выводится из 'exceptionClass', блок' catch' будет пропущен. – cmannett85

+1

Я вижу, тогда достаточно добавить catch (...) и считать его необработанным – ixSci

Смежные вопросы