Komponententest, dass die Ausnahme beim n-ten Aufruf zur Funktion ausgelöst wird

8

Nehmen wir an, Sie haben eine Methode, die letztendlich zu

führt %Vor%

Wie würdest du diese Klasse testen? I.e. Testen Sie, ob die Ausnahme beim dritten Aufruf von next() mit PHPUnit ausgelöst wird? Ich habe meinen Versuch als Antwort hinzugefügt, aber ich bin mir nicht sicher, ob das wirklich der richtige Weg ist.

    
Shane 13.10.2012, 16:48
quelle

5 Antworten

7

Was ist mit dem Testen von null bei den ersten beiden Aufrufen? Testen Sie auch, ob die Ausnahme wie folgt ausgelöst wird:

%Vor%     
PeeHaa 13.10.2012, 17:21
quelle
4

Es ist sehr wichtig, beim Komponententest die Implementierung -Details zu vermeiden. Stattdessen möchten Sie sich darauf beschränken, nur die öffentliche Schnittstelle Ihres Codes zu testen. Warum? Da sich die Implementierungsdetails häufig ändern, sollte sich Ihre API jedoch nur sehr selten ändern. Das Testen der Implementierungsdetails bedeutet, dass Sie Ihre Tests ständig neu schreiben müssen, wenn sich diese Implementierungen ändern, und Sie möchten nicht dabei bleiben.

Was bedeutet das für den OP-Code? Sehen wir uns die öffentliche Methode Pager::next an. Code, der die Pager -Klassen-API verwendet ist nicht wichtig wie Pager::next bestimmt, ob eine Ausnahme ausgelöst werden soll. Es nur interessiert sich dafür, dass Pager::next tatsächlich eine Ausnahme auslöst, wenn etwas nicht stimmt.

Wir wollen nicht testen, wie die Methode zu ihrer Entscheidung kommt, ein OutOfBoundsException zu werfen - das ist ein Implementierungsdetail. Wir wollen nur testen, ob es dies tut.

Um dieses Szenario zu testen, simulieren wir eine Situation, in der Pager::next werfen wird. Um dies zu erreichen, implementieren wir einfach eine sogenannte "Testnaht". ...

%Vor%

Im obigen Code ist die geschützte Methode Pager::isValid unsere Testnaht. Es stellt eine Naht in unserem Code (daher der Name) zur Verfügung, die wir zu Testzwecken einklinken können. Mit unserem neuen Test-Seam und der Pseudo-API von PHPUnit ist das Testen von Pager::next eine Ausnahme für ungültige Werte von $i trivial:

%Vor%

Beachten Sie, dass es bei diesem Test nicht besonders darauf ankommt, wie die Implementierungsmethode Pager::isValid bestimmt, dass das aktuelle Inkrement ungültig ist. Der Test verhöhnt einfach die Methode, um false zurückzugeben, wenn sie aufgerufen wird, damit wir testen können, ob unsere öffentliche Pager::next -Methode eine Ausnahme auslöst, wenn dies der Fall ist.

Die PHPUnit-Mocking-API ist vollständig im Testdoppelbereich des PHPUnit-Handbuchs enthalten . Die API ist nicht die intuitivste Sache in der Geschichte der Welt, aber mit etwas wiederholtem Gebrauch macht es im Allgemeinen Sinn.

    
rdlowrey 13.10.2012 17:38
quelle
1

Folgendes habe ich im Moment, aber ich habe mich gefragt, ob es dafür bessere Möglichkeiten gäbe.

%Vor%     
Shane 13.10.2012 16:48
quelle
0

Sie könnten etwas wie:

verwenden %Vor%

Wenn im dritten Methodenaufruf eine Ausnahme ausgelöst wird, sollte die immer fehlgeschlagene assert-Anweisung niemals erreicht werden und der Test bestanden werden. Wenn andererseits keine Ausnahme ausgelöst wird, wird der Test fehlschlagen.

    
user1708452 13.10.2012 17:10
quelle
0

Sie können den Wert $ this- & gt; i an die Ausnahmeinstanziierung übergeben, die dann die Nachricht der Ausnahme ist.

%Vor%     
Asad Saeeduddin 13.10.2012 16:57
quelle

Tags und Links