Dieses Makro zeigt das Prinzip. Der typeid
Vergleich ist ein spezieller Anwendungsfall, also kann oder darf er nicht verwendet werden - er erlaubt es dem Makro, den Test zu "scheitern", selbst wenn die geworfene Ausnahme von derjenigen stammt, gegen die Sie testen. Oft wirst du das nicht wollen, aber ich habe es trotzdem geworfen!
#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;
}
Returns:
Caught
Derived exception caught
Nothing thrown
es Zur Anpassung für QTest
Sie benötigen, um ein mit QFAIL
nicht zu erzwingen.
Ausnahmen sind in der qt-Welt nicht sehr häufig. Es gibt afaik kein spezifisches Makro in QTest dafür, aber du könntest einen Versuch machen, den Block zu blockieren und ihn mit QVERIFY zu testen. Alternativ könntest du auch google test mit qt verwenden (was aus verschiedenen Gründen viel besser ist als qtest imho) – TWE
Ja, zu diesem Zeitpunkt erkenne ich, dass gtest weit besser ist als QTest. Vielen Dank! – Killrazor
Außerdem unterstützt gtest gmock, während es für QTest nichts Vergleichbares gibt. QTest ist wirklich nur für den gelegentlichen Gebrauch, nicht für gute UT. Das einzige, was Sie von QTest brauchen, wenn Sie gtest verwenden, ist QSignalSpy. Alle anderen Dinge sind viel besser in gtest. – ixSci