2016-05-04 13 views
3

Ich habe eine Symfony-Controller mit Versuch ... fangen. Ich benutze phpunit um meine Anwendung zu testen. Ich habe gesucht, aber nicht einen Weg gefunden, wie man den Code innerhalb einer Catch-Ausnahme testen kann. Wie kann ich die PHP-Einheit zwingen, so zu tun, als ob etwas schief gelaufen wäre und in den Catch-Block eindringt und dies auch testet?PHPUnit Testcode innerhalb catch Block

dh:

try { 
     $foo = 1; 
    } catch (\Exception $ex) { 
     $mail = new Mail(); 
     $mail->sendMail(); 
     return new Response(); 
    } 

Wie kann ich phpunit sagen eine \ Exception zu werfen, so dass es Code in catch-Block von oben testen?

+1

Wenn Ihr Controller unter bestimmten Bedingungen eine Ausnahme auslöst und Sie ihn testen möchten, simulieren Sie diese Bedingungen. – Federkun

+0

yeah, Sie können die Bedingungen erstellen, in denen Ihr Code eine Ausnahme erzeugt. – Aparna

+0

Welchen Code hast du da genau? Das muss etwas, das in der realen Anwendung eine Ausnahme auslöst. Und Sie müssen diesen Teil verspotten, um die Ausnahme zu werfen. Trotzdem wäre es gut, wenn Sie uns den Code zeigen könnten. –

Antwort

1

Nun, unter diesen Bedingungen wird es natürlich keine Ausnahmen werfen, aber betrachten Sie die Funktion, die Ihr Versuch/Fang innerhalb liegt. Sie müssen diese Funktion in einem Unit-Test testen und Argumente angeben, die zum Fehlschlagen und Fangen führen.

Zum Beispiel:

public function doStuff($argument) { 
    try { 
     $parsed = (int)$argument; //but what if $argument is a string with letters 
    } catch (\Exception $ex) { 
     //do stuff 
    } 

Um zu testen, dass eine Ausnahme ausgelöst wird, wenn Sie mess es:

public function testDoStuff() { 
    // get a mock of the class, let's just call it $mock 
    // do some regular asserts if you want 

    $this->setExpectedException('\Exception'); 
    $mock->doStuff('haha, you can't parse this'); 
} 
0

Wenn Sie wirklich einige komplexen Materialien in Ihrem catch Block haben Sie es bewegen separate geschützte Methode des Controllers und separat testen. Sie können leicht auf die geschützte Methode außerhalb ihrer Klasse zugreifen, indem Sie eine Reflektion verwenden.