2011-05-09 26 views
8

estoy usando marco PHPUnit y tengo un código como el siguiente:PHPUnit y morir función

public function A() { 

try { 

    (...some code...) 

    die (json_encode ($data)); 

} 

catch (Exception $e) { 
    die(false); 
} 

} 

Esta función se llama a través de AJAX y no puede sustituir a morir con retorno. La pregunta es: ¿Cómo puedo hacer una prueba unitaria con un código como este?

No puedo usar para esto, afirma.

Gracias.

+0

¿Esta pregunta no pertenece a StackOverflow? – slubman

+0

@slubman, sí, creo que sí. Tengo un voto para migrarlo. Si lo marca para moverlo, lo ayudará a pasarlo más rápido. – Caleb

+0

@doctore: no edite para volver a agregar elementos que se hayan editado debido a las pautas de estilo de este sitio. Lee http://tinyurl.com/so-hints para obtener algunas ideas sobre cómo hacer preguntas, pero en resumen, agregar agradecimientos por adelantado en las preguntas es solo una distracción de la pregunta; en esta comunidad dices gracias votando y devolviendo el favor ayudando a otros con sus preguntas. – Caleb

Respuesta

17

No se puede probar que ...

A veces las pruebas unitarias hace aparecer problemas como éste (situaciones no comprobables). Eso generalmente significa que el problema no está en las pruebas, sino en su código y su arquitectura.

Aquí no se debe utilizar la función die (en realidad no se debe utilizar die para devolver una respuesta HTTP), pero echo el JSON y luego dejar que la secuencia de finalización adecuadamente (o return el JSON y echo en alguna parte más).

Para probar esto, puede capturar la salida y verificarla (este es un ejemplo básico, creo que es mucho mejor).

Conclusión: el problema está en su código, solucione esto y luego intente probarlo. Si no puedes, entonces no hay pruebas.

+4

+1 Lo pones mejor que yo. "Si es difícil de probar, está mal codificado." –

+0

@Blowski:" Si es difícil de probar, está mal codificado. "Me encanta esta frase, esto siempre es un fastidio al escuchar eso (he estado en esa situación muchas veces), pero es casi siempre cierto ... Una buena programación es difícil;) –

+0

+1 de mí también para darme una nueva oración para mi firma: D – superbly

3

¿Por qué no puede reemplazar die() con un return?

Mi solución sería hacer que esto arroje una excepción, y luego atrapar la excepción con otro método. Luego puede probar la unidad function a(), comprobando que arroja el tipo correcto de excepción. La otra función maneja el die().

3

en realidad parece que morir no es una buena solución aquí. , pero si no hay forma de cambiar esto probablemente podría ejecutar la función en otro proceso.

para esto tiene que escribir un archivo de prueba que ejecuta la función A. ej.

<?php 
include 'fileWithAFunction.php'; 
A(); 
?> 

ahora llaman a este script con shell_exec.

$return = shell_exec('testscript.php'); 

la variable de retorno mantiene el resultado del testcript.

+2

+1 para señalar * cómo * hacerlo cuando * no * puede cambiar el código original por razones que escapan a su control. –

+0

También podría hacer un 'file_get_contents ('http://example.com/testscript.php')'. – dave1010