2010-12-18 18 views
5

sospecho PHPUnit está demostrando que 1 línea de código no está cubierto por las pruebas de unidad a causa de excepciones eso es lanzado (pero me atrapó)PHPUnit Cobertura y excepciones Código

He unidad de prueba que debería cubrir esa línea

/** 
* @expectedException Doctrine\ORM\NoResultException 
*/ 
public function testCannotLoginInvalidUser() { 

    $user = User::login($this->em, 'nonExistant', 'password'); 
    $this->assertNull($user); 

} 

¿Por qué la cobertura de mi código sigue reflejando que no está cubierta?

me devuelva NULL ... He descubierto que esa línea es realmente no cubierto ...

try { 
    $user = $query->getSingleResult(); 
} catch (Exception $e) { 
    echo 'caught exception'; <-- this does not get executed. 
    return null; 
} 

IS es arrojado una prueba ... b4 añadido eco PHPUnit saltarse toda la ejecución vez una excepción?

ACTUALIZACIÓN: Tengo la sensación de que estoy usando @expectedException aunque mal ...

+0

es su método "login" dentro de un espacio de nombres? –

+0

@Anti Veeranna, Sí, está en 'Application \ Models'. ¿Está cambiando el nombre en un espacio de nombres? –

Respuesta

4

Sus ejemplos de código son sólo la punta del iceberg, es difícil determinar con precisión el problema exacto.

Pero un detalle parece sospechoso para mí: dado que el método de inicio de sesión es en la aplicación \ Modelos a continuación, el siguiente código

try { 
    $user = $query->getSingleResult(); 
} catch (Exception $e) { 

no cogerá ninguna excepción, sería coger \ Application \ Modelos \ Excepción - si incluso tienes una clase así definida.

Quizás esa sea la razón por la que su manejador de excepciones no se ejecuta.

+1

A menos que me equivoque, la solución es cambiar la clase de excepción a '\ Exception' para que capture todos los tipos de excepción. –

2

la anotación @expectedException es similar a este testcode:

public function testDoStuff() { 
    try { 
     doStuff(); 
    } catch(Exception $e) { 
     // Test passed 
     return; 
    } 
    $this->fail("Exception not thrown, test failed !"); 
} 

por lo que no puede (no debe) prueba dos cosas a la vez en ese caso de prueba. (Si se lanza la excepción Y el valor de retorno)

Si desea probar que User::login arroja una excepción, es bueno ir para ese caso de prueba y no es necesaria la aserción (ese código no se ejecuta de todos modos :))

Para get the red line covered debe escribir el código para que $ query-> getSingleResult() arroje una excepción. Eso podría ser complicado, pero como no veo suficiente de la fuente (como de dónde viene el objeto de consulta) no puedo ser específico aquí.

Si el objeto $ consulta es un simulacro de dejar que una excepción en -> getSingleResult y escribir caso_prueba la comprobación de "nulo"

Cuestiones relacionadas