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.
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". ...
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:
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.
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.
Sie können den Wert $ this- & gt; i an die Ausnahmeinstanziierung übergeben, die dann die Nachricht der Ausnahme ist.
%Vor%