2011-01-10 17 views
12

No entiendo cómo probar Excepciones con PHPUnit.Cómo realizar pruebas unitarias Excepciones con PHPUnit?

Por favor, vea mi método con la excepción:

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 
    } 

Y ahora mi PHPUnit prueba:

<?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.'); 
     } 



    } 
} 
?> 

Si funciono con la prueba llegué "fracaso":

1) ScrapTest::testGetPhone 
Expected exception Exception 

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

La excepción aumenta, pero no quiero que se produzca un error en PHPUnit. Si se produce una excepción, quiero que la prueba sea correcta.

¿Puede darme algunas pistas?

Saludos cordiales,

+1

posible duplicado de [Cómo utilizar setExpectedException de PHPUnit()?] (Http://stackoverflow.com/questions/4646298/how-to-use-phpunits-setexpectedexception) – zerkms

+0

se le preguntó hace apenas un par de minutos – Gordon

Respuesta

29

Estás haciendo demasiado allí.

Éter uso: @expectedException Excepción

O: try/catch/$ this-> falle

La forma en que lo está haciendo bien ahora dice que "catch excepción y luego esperar la código para lanzar otro! "

La primera forma es más limpia en mi opinión, ya que es solo 1 línea contra 5 (o incluso más) líneas de código y es menos propensa a errores.

/** 
* @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');   

Eso debería hacerlo.

+4

Usted puede también use '$ this-> setExpectedException ('ExceptionTypeGoesHere')' en la parte superior de su método de prueba, así como los dos enumerados anteriormente. Creo que este es el enfoque más limpio. – TeaPow

12

Hay dos maneras de probar las excepciones lanzadas, pero esto depende de sus necesidades. Si no se preocupan por el contenido/propiedades de la excepción (es decir, código, mensaje, etc), entonces usted puede hacer:

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

lo demás, si es necesario utilizar las propiedades de excepción a la afirmación (es decir, el código) , entonces usted puede hacer el try-catch-falla:

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

$this->fail(); 

Aviso return la declaración dentro del bloque catch. La declaración $this->fail(); solo se debe invocar una vez que no se produce una excepción. Por lo tanto, este caso de prueba falla porque debe probar la excepción que no se lanzó en primer lugar.

+1

Al menos desde phpunit 6.1 esto ya no funciona. _Debe ser lo más específico posible cuando pruebe excepciones. Las pruebas para las clases que son demasiado genéricas pueden llevar a efectos secundarios indeseables. En consecuencia, las pruebas para la clase Exception con @expectedException o setExpectedException() ya no están permitidas._ https://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for- phpunit.excepciones – dotnetCarpenter

+0

en PHPunit 6+ necesitamos usar función pública testGetPhone() { $ this-> expectException (\ InvalidArgumentException :: class); algún código causa la excepción aquí } –