2011-01-10 7 views
12

Nie rozumiem, jak testować wyjątki w jednostce PHPUnit.Jak testować jednostki Wyjątki w PHPUnit?

proszę zobaczyć moją metodę z wyjątkiem:

public function getPhone($html, $tag = 'OFF', $indicative, $number_lenght) { 

     // .. code 

     if ($tag <> 'OFF') { 

      $html = $doc[$tag]->text(); // Apanho apenas o texto dentro da TAG 
       if (empty($html)) { 
        throw new Exception("Nao foi possivel apanhar qualquer texto dentro da TAG, Metodo em causa: getPhone()"); 
       }    
     } 

     // .. code 
    } 

a teraz moje PHPUnit Test:

<?php 

require_once '../Scrap.php'; 

class ScrapTest extends PHPUnit_Framework_TestCase 
{ 

    protected $scrap; 

    // Setup function to instantiate de object to $this->scrap 
    protected function setUp() 
    { 
     $this->scrap = new Scrap; 
    } 

    /** 
    * @covers Scrap::getPhone 
    * @expectedException Exception 
    * 
    */ 
    public function testGetPhone() { 

     // Variables1 
     $array_static1 = Array(0 => 218559372, 1 => 927555929, 2 => 213456789, 3 => 912345678); 
     $phone_list1 = '</div>A Front para<br /><br /><br /><br /><br /><br />-Apoio;<br />-Criação;<br />-Campanhas;<br />-Promoções<br /><br /><br />CONDIÇÕES:<br /><br />Local de Trabalho: Es<br />Folgas: Mistas<br /><br /><br /><br />ordem 500€<br /><br /><br /><br />Mínimos:<br /><br />- Conhecimentos;<br />- Ensino ;<br />-INGLÊS.<br /><br /><br /><br />Candidaturas: <br />[email protected]<br />218559372 | 927 555 929 | <br />RH<br />Rua C. Sal. 40<br />1000-000 Lisboa<br /><br /><br />+351 21 3456789 | (351) 912345678'; 

     // Variables2 
     $array_static2 = Array(0 => 'NA'); 
     $phone_list2 = ""; 

     // .. more tests 

     // Test Exception, Tag not found 
     if (TRUE) { 

      // Bloco try/catch para confirmar que aqui lança excepção 
      try {    
        $this->scrap->getPhone($phone_list1, 'hr', '351', '9');   
       }   
      catch (Exception $expected) { 
        return;   
       }   

      $this->fail('An expected exception has not been raised.'); 
     } 



    } 
} 
?> 

Gdybym uruchomić test dostałem "Awaria":

1) ScrapTest::testGetPhone 
Expected exception Exception 

FAILURES! 
Tests: 1, Assertions: 5, Failures: 1. 

Wyjątek wzrasta, ale nie chcę, aby uzyskać niepowodzenie w PHPUnit, Jeśli podnieść Wyjątek, chcę, aby test był OK.

Czy możesz podać mi jakieś wskazówki?

Pozdrowienia,

+1

możliwe duplikat [Jak korzystać setExpectedException phpunit'S()?] (Http://stackoverflow.com/questions/4646298/how-to-use-phpunits-setexpectedexception) – zerkms

+0

został poproszony zaledwie kilka minut temu – Gordon

Odpowiedz

29

Za dużo tam robisz.

Ether zastosowanie: @expectedException Wyjątek

LUB: try/catch/$ this-> nie

Sposób robisz to teraz mówi „złapać ten wyjątek i WTEDY oczekiwać kod do rzucenia innego! "

Pierwszy sposób jest, moim zdaniem, czystszy, ponieważ jest tylko jeden wiersz na 5 (lub nawet więcej) linii kodu i jest mniej podatny na błędy.

/** 
* @covers Scrap::getPhone 
* @expectedException Exception 
* 
*/ 
public function testGetPhone() { 

    // Variables1 
    $array_static1 = Array(0 => 218559372, 1 => 927555929, 2 => 213456789, 3 => 912345678); 
    $phone_list1 = '...'; 

    // Variables2 
    $array_static2 = Array(0 => 'NA'); 
    $phone_list2 = ""; 

    // .. more tests 

    // Bloco try/catch para confirmar que aqui lança excepção 
    $this->scrap->getPhone($phone_list1, 'hr', '351', '9');   

To powinno wystarczyć.

+4

Można również użyj '$ this-> setExpectedException ('ExceptionTypeGoesHere')' u góry twojej metody testowej, jak również dwóch wymienionych powyżej. Myślę, że to najczystsze podejście. – TeaPow

12

Istnieją dwa sposoby testowania zgłaszanych wyjątków, ale zależy to od Twoich potrzeb. Jeśli nie dbają o zawartości/właściwości wyjątku (czyli kodu, wiadomości itp), a następnie można zrobić:

$this->setExpectedException('MyApp\Exception'); 
$object->someFailingCodeWithException(); 

Inaczej, jeśli trzeba użyć właściwości wyjątek dla twierdzenia (czyli kod) , a następnie można wykonać try-catch-fail:

try { 
    $object->someFailingCodeWithException(); 
} catch (MyApp\Exception $e) { 
    $this->assertEquals($e->getCode(), 100); 
    return; 
} 

$this->fail(); 

Wskazówka oświadczenie wewnątrz bloku catchreturn. Instrukcja $this->fail(); będzie/musi być wywołana tylko wtedy, gdy nie zostanie zgłoszony wyjątek. Tak więc, ten przypadek testowy nie powiedzie się, ponieważ powinien przetestować wyjątek, który nie jest generowany w pierwszej kolejności.

+1

Przynajmniej z phpunit 6.1 to już nie działa. Powinieneś być jak najbardziej konkretny podczas testowania wyjątków. Testowanie na zbyt ogólne klasy może prowadzić do niepożądanych efektów ubocznych. W związku z powyższym, testowanie klasy Exception z @expectedException lub setExpectedException() nie jest już dozwolone. Https://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for- phpunit.wyjątki – dotnetCarpenter

+0

w PHPunit 6+ musimy użyć funkcji publicznej testGetPhone() { $ this-> expectException (\ InvalidArgumentException :: class); niektóre kod powodują tutaj wyjątek } –