Spottmethoden zum Auslösen von Error phpunit

Lesezeit: 3 Minuten

Benutzeravatar von Nikhil Kuriakose
Nikhil Kuriakose

PHPUnit ließ mich einen Methoden-Stub erstellen, um eine Ausnahme auszulösen, und zwar mit einer der folgenden Methoden:

  • [->will($this->throwException(..)][1]
  • ->willThrowException(..

Ich muss einige Fälle testen, in denen der Methoden-Stub PHP-Fehler auslöst.

Unterstützt PHPUnit so etwas? Irgendwelche Problemumgehungen hier?

  • Was meinst du damit? Du kannst Wurf Ausnahmen, und Sie können Abzug Fehler.

    – lokalheinz

    27. August 2017 um 13:17 Uhr

  • Meine Semantik kann falsch sein. Aber ich wollte per Stub Throw/Trigger Fehler machen. Habe es selbst beantwortet.

    – Nikhil Kuriakose

    27. August 2017 um 13:21 Uhr

  • Beachten Sie, dass dies nur in PHP 7 und höher funktioniert, siehe php.net/manual/en/language.errors.php7.php.

    – lokalheinz

    27. August 2017 um 13:24 Uhr

Die throwException() in der PHPUnit TestCase-Klasse kann jede Instanz von Throwable als Parameter annehmen.

Das heisst,

->will($this->throwException(new Error()));
->will($this->throwException(new Exception()));

sind beide gültig

  • Übrigens können Sie verwenden willThrowException() stattdessen.

    – lokalheinz

    27. August 2017 um 13:23 Uhr

  • Nein, willThrowException() kann nur eine Ausnahme als Parameter annehmen, keinen Fehler.

    – Nikhil Kuriakose

    27. August 2017 um 13:26 Uhr

  • Nur zur Information, die willThrowException() Methode akzeptiert jetzt \Throwable nicht nur \Exception auf PHPUnit 8 (mindestens 8.2, nicht auf früherer Version ausprobiert)

    – Etschi

    25. Juni 2019 um 11:38 Uhr


  • @NikhilKuriakose: Wenn dies die Frage beantwortet, markieren Sie sie bitte als “Antwort”.

    – k00ni

    15. Januar 2020 um 8:59 Uhr


Benutzeravatar von Matt Doran
Matt Doran

Sie können eine Funktion in einem Test wie folgt veranlassen, eine Ausnahme auszulösen:

$handlerConsentMessage = $this->getMockBuilder('YourClass')
            ->setMethods(array('yourMethod'))->getMock();

$handlerConsentMessage->method('yourMethod')->willThrowException(new Exception());

$handlerConsentMessage->run('functionToRun');

Wenn Sie nun Ihre Testfunktion functionToRun ausführen, wenn die Funktion YourMethod jemals aufgerufen wird, wird sie eine Ausnahme auslösen.

Einfach einen Fehler auslösen:

$foo
    ->expects($this->once())
    ->method('bar')
    ->willReturnCallback(function () {
        trigger_error(
            'Now really is not a good time',
            E_USER_ERROR
        );
    });

Als Referenz siehe:

  • Schön, jetzt wird es interessant. Ich gehe davon aus, dass beide Verhaltensweisen (Ihre Antwort und meine) genau die gleiche Ausgabe liefern?

    – Nikhil Kuriakose

    27. August 2017 um 13:24 Uhr

  • Ha, deine ist definitiv besser und macht auf PHP7 mehr Sinn. Ich hatte noch nicht das Bedürfnis, einen Fehler auszulösen (im Gegensatz zum Auslösen von Ausnahmen), also habe ich das, was ich hier vorgeschlagen habe, noch nicht wirklich verwendet.

    – lokalheinz

    27. August 2017 um 13:26 Uhr

  • Aber das ist gut. Ich habe stundenlang nach Antworten gesucht und plötzlich habe ich zwei 🙂 Danke!!!

    – Nikhil Kuriakose

    27. August 2017 um 13:27 Uhr

  • Froh, dass Sie es mögen! Oft macht es Sinn, jemanden zu fragen, hehe!

    – lokalheinz

    27. August 2017 um 13:28 Uhr

Hochwertiger Code erzeugt während der normalen Arbeit keine PHP-Fehler (Notice, Warning, Fatal, Parse Errors). Wenn es immer noch Fehler produziert – sollten Sie Versuchen Sie, solche Grenzfälle zu erkennen und Ausnahmen auszulösen / ein anderes Ergebnis zurückzugeben. Dann sind diese Ausnahmen in PHPUnit-Tests leicht mockbar.

Andere Problemumgehung, wenn es nicht möglich ist, die getestete Klasse zu ändern– dient dazu, den Fehler-Listener in Ihrem Test zu definieren, siehe set_error_handler. Die Logik sollte folgende sein:

  1. Die getestete Methode generiert einen Fehler, z. B. eine Warnung
  2. Die Warnung wird von set_error_handler innerhalb Ihres Tests abgefangen.
  3. Innerhalb des Rückrufs von set_error_handler setzen Sie eine Variable, um anzuzeigen, dass die Warnung abgefangen wurde. (es könnte eine statische Eigenschaft oder ein anderer Speicher sein)
  4. Am Ende des Tests behaupten Sie, dass die statische Eigenschaft einen bestimmten Wert hat = es bedeutet, dass eine Warnung generiert wurde.
1430290cookie-checkSpottmethoden zum Auslösen von Error phpunit

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy