Этот макрос демонстрирует принцип.
Сравнение является специальным прецедентом, поэтому может или не хотеть использовать его - он позволяет макросу «провалить» тест, даже если выбрано исключение из того, с которым вы тестируете. Часто вам это не нужно, но я все равно его бросил!
#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
.
Исключения не очень распространены в мире qt. Для этого в QTest не существует определенного макроса afaik, но вы можете сделать блок catch try, чтобы проверить его с помощью QVERIFY. В качестве альтернативы вы также можете использовать google test с qt (что по нескольким причинам намного лучше, чем qtest imho) – TWE
Да, к этому времени я понимаю, что gtest намного лучше, чем QTest. Благодаря! – Killrazor
Кроме того, gtest поддерживает gmock, в то время как для QTest нет ничего подобного. QTest действительно предназначен для случайного использования, а не для хорошего UT. Единственное, что вам нужно от QTest, если вы используете gtest, - это QSignalSpy. Все остальные вещи намного лучше в gtest. – ixSci