Obviamente es una vieja pregunta, pero mi sugerencia sería mover el código que die()
's en un método separado que luego puede burlarse.
A modo de ejemplo, en lugar de tener presente:
class SomeClass
{
public function do()
{
exit(1);
// or
die('Message');
}
}
hacer esto:
class SomeClass
{
public function do()
{
$this->terminate(123);
// or
$this->terminate('Message');
}
protected function terminate($code = 0)
{
exit($code);
}
// or
protected function terminate($message = '')
{
die($message);
}
}
esa manera se puede burlar fácilmente el método terminate
y usted no tiene que preocuparse por el script que termina sin que puedas atraparlo.
Su prueba sería algo como esto:
class SomeClassTest extends \PHPUnit_Framework_TestCase
{
/**
* @expectedExceptionCode 123
*/
public function testDoFail()
{
$mock = $this->getMock('SomeClass');
$mock->expects($this->any())
->method('terminate')
->will($this->returnCallback(function($code) {
throw new \Exception($code);
}));
// run to fail
$mock->do();
}
}
No he probado el código, pero debería ser bastante cercano a un estado de trabajo.
Sí, en este momento he decidido lanzar una excepción. El problema es que mi manejador de excepciones predeterminado está destinado a llamar a esta función, así que tengo que crear una nueva excepción llamada killProgramException que mi manejador de excepciones ignora. Tipo de hacky –