2010-11-11 25 views
6

Tengo un conjunto de pruebas, y quiero probar que mis clases arrojen excepciones en el momento correcto. En el ejemplo, mi clase utiliza el método mágico __get(), por lo que necesita para probar que se produce una excepción cuando una propiedad no válida se recupera:PHPUnit no detecta excepciones esperadas

function testExceptionThrownWhenGettingInvalidProperty() { 
    $obj = new MyClass(); 
    $this->setExpectedException("Property qwerty does not exist"); 
    $qwerty = $obj->qwerty; 
} 

La clase genera un error como debe ser, pero en lugar de acaba de obtener un pase, la excepción no está atrapado!

There was 1 error: 

1) QueryTest::testExceptionThrownWhenGettingInvalidProperty 
Exception: Property qwerty does not exist 

que estaba usando SimpleTest antes, y $this->expectException(new Exception("Property qwerty does not exist")); funcionaba bien. Sé que hay otros métodos (@expectedException y try-catch), pero este debería funcionar y se ve mucho más limpio. ¿Alguna idea de cómo puedo hacer que esto funcione?

Respuesta

13

No es buscar el texto de la excepción, que está buscando el nombre de la clase de excepción ... Docs

$this->setExpectedException('Exception'); 

Es muy útil cuando se está utilizando SPL Exceptions, o clases de excepción personalizada .. .

+0

Gracias! Pasé por alto completamente eso porque estaba acostumbrado a la forma SimpleTest de hacerlo. ¿Sabes si hay una manera fácil de probar el texto? –

+0

@ Nathan, @ircmaxell: Vea mi respuesta, hay una mejor manera de hacerlo, incluida la prueba de texto. – ryeguy

+0

@ircmaxell: No estoy de acuerdo con el mensaje que no importa. No ve ningún lenguaje o marco bien diseñado que cree una nueva excepción por cada nuevo error que aparezca. Eso sería demasiado trabajo. – ryeguy

13

Agregando a la respuesta de ircmaxell, en realidad hay una manera más sencilla de hacer esto:

/** 
* @expectedException MyExceptionClass 
* @expectedExceptionMessage Array too small 
*/ 
public function testSomething() 
{ 
} 

El @expectedException el nombre de clase de la excepción a esperar, y @expectedExceptionMessage es una subcadena del mensaje de excepción a esperar (es correcto, no es necesario que tenga el mensaje completo).

Si prefiere no utilizar las anotaciones de docblock, ambas están realmente disponibles como métodos en el caso de prueba.

+4

+1 ... No tenía conocimiento del '@expectedExceptionMessage 'docblock element ... Aprende algo nuevo todos los días ... – ircmaxell

+0

@ircmaxell: Sí, acabo de descubrirlo hace un momento. No se menciona en ninguna parte excepto en el apéndice "Anotaciones". Incluso entonces, no hay documentos en él, solo enumera su nombre. – ryeguy

+0

muy agradable - ¡gracias! – jmadsen

Cuestiones relacionadas