2013-02-20 17 views
7

Ich sage in QT C++ Welt. Ich mache TDD mit QTest-Klasse. Ich möchte überprüfen, dass unter bestimmten Bedingungen eine Ausnahme von meiner Klasse im Test ausgelöst wird. Verwendung von Google-Test, würde ich so etwas wie:Wie überprüfe ich mit QTest, dass eine Ausnahme ausgelöst wird?

EXPECT_THROW(A(NULL), nullPointerException); 

Ist es so etwas wie diese Funktion in QTest existiert? O wenigstens ein Weg, es zu tun?

Danke!

+1

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

+0

Ja, zu diesem Zeitpunkt erkenne ich, dass gtest weit besser ist als QTest. Vielen Dank! – Killrazor

+0

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

Antwort

10

Seit Qt5.3 bietet QTest ein Makro QVERIFY_EXCEPTION_THROWN, das die fehlende Funktion bietet.

+0

Das einzige Problem mit diesem ist, dass "wenn nicht substituierbar Art der Ausnahme ausgelöst wird oder der Ausdruck keine Ausnahme überhaupt wirft, dann wird ein Fehler im Test aufgezeichnet werden log und der Test wird nicht weiter ausgeführt. ". Das bedeutet, dass es praktisch keine Out-of-the-Box-Lösung gibt, mit der Sie überprüfen können, ob etwas ** den angegebenen Ausnahmetyp (oder abgeleiteten) ** nicht auswirft. – rbaleksandar

5

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.

+0

Warum verwenden Sie nicht 'catch (const exceptionClass & e) {\ if (typeid (e) == typeid (exceptionClass)) {' unabhängig von std :: exception? – ixSci

+0

Wenn die Ausnahme nicht von 'exceptionClass' abgeleitet ist oder nicht, wird der' catch' Block übersprungen. – cmannett85

+1

Ich sehe, dann ist es genug zu fangen (...) und zählen Sie es als unbehandelt – ixSci

Verwandte Themen