473 Stimmen

PHPUnit behaupten, dass eine Ausnahme ausgelöst wurde?

Weiß jemand, ob es eine assert oder etwas Ähnliches, das prüfen kann, ob im getesteten Code eine Ausnahme ausgelöst wurde?

7voto

Westy92 Punkte 14901

Hier finden Sie alle Ausnahmen, die Sie machen können. Beachten Sie, dass alle von ihnen sind optional .

class ExceptionTest extends PHPUnit_Framework_TestCase
{
    public function testException()
    {
        // make your exception assertions
        $this->expectException(InvalidArgumentException::class);
        // if you use namespaces:
        // $this->expectException('\Namespace\MyException');
        $this->expectExceptionMessage('message');
        $this->expectExceptionMessageRegExp('/essage$/');
        $this->expectExceptionCode(123);
        // code that throws an exception
        throw new InvalidArgumentException('message', 123);
   }

   public function testAnotherException()
   {
        // repeat as needed
        $this->expectException(Exception::class);
        throw new Exception('Oh no!');
    }
}

Die Dokumentation ist zu finden unter これ .

3voto

C Cislariu Punkte 178
/**
 * @expectedException Exception
 * @expectedExceptionMessage Amount has to be bigger then 0!
 */
public function testDepositNegative()
{
    $this->account->deposit(-7);
}

Seien Sie sehr vorsichtig mit "/**" Beachten Sie das doppelte "*". Wenn Sie nur "**" (Sternchen) schreiben, wird Ihr Code nicht funktionieren. Stellen Sie außerdem sicher, dass Sie die letzte Version von phpUnit verwenden. In einigen früheren Versionen von phpunit wird @expectedException Exception nicht unterstützt. Ich hatte 4.0 und es hat bei mir nicht funktioniert, ich musste auf 5.5 updaten. https://coderwall.com/p/mklvdw/install-phpunit-with-composer mit Composer zu aktualisieren.

1voto

PhpUnit ist eine erstaunliche Bibliothek, aber dieser spezielle Punkt ist ein bisschen frustrierend. Aus diesem Grund können wir die Open-Source-Bibliothek turbotesting-php verwenden, die eine sehr bequeme Assertion-Methode hat, um uns beim Testen von Ausnahmen zu helfen. Sie ist hier zu finden:

https://github.com/edertone/TurboTesting/blob/master/TurboTesting-Php/src/main/php/utils/AssertUtils.php

Und um sie zu nutzen, müssen wir nur Folgendes tun:

AssertUtils::throwsException(function(){

    // Some code that must throw an exception here

}, '/expected error message/');

Wenn der Code, den wir innerhalb der anonymen Funktion eingeben, keine Ausnahme auslöst, wird eine Ausnahme ausgelöst.

Wenn der Code, den wir innerhalb der anonymen Funktion eingeben, eine Ausnahme auslöst, aber seine Nachricht nicht mit dem erwarteten Regexp übereinstimmt, wird ebenfalls eine Ausnahme ausgelöst.

0voto

aCiD Punkte 1133

Für PHPUnit 5.7.27 und PHP 5.6 und um mehrere Ausnahmen in einem Test zu testen, war es wichtig, die Ausnahmeprüfung zu erzwingen. Die Verwendung der Ausnahmebehandlung allein, um die Instanz von Exception zu bestätigen, überspringt das Testen der Situation, wenn keine Ausnahme auftritt.

public function testSomeFunction() {

    $e=null;
    $targetClassObj= new TargetClass();
    try {
        $targetClassObj->doSomething();
    } catch ( \Exception $e ) {
    }
    $this->assertInstanceOf(\Exception::class,$e);
    $this->assertEquals('Some message',$e->getMessage());

    $e=null;
    try {
        $targetClassObj->doSomethingElse();
    } catch ( Exception $e ) {
    }
    $this->assertInstanceOf(\Exception::class,$e);
    $this->assertEquals('Another message',$e->getMessage());

}

0voto

sami klah Punkte 11
function yourfunction($a,$z){
   if($a<$z){ throw new <YOUR_EXCEPTION>; }
}

Hier ist der Test

class FunctionTest extends \PHPUnit_Framework_TestCase{

   public function testException(){

      $this->setExpectedException(<YOUR_EXCEPTION>::class);
      yourfunction(1,2);//add vars that cause the exception 

   }

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X