È ovviamente una vecchia domanda, ma il mio suggerimento sarebbe quello di spostare il codice che è die()
in un metodo separato che è quindi possibile prendere in giro.
A titolo di esempio, invece di avere questo:
class SomeClass
{
public function do()
{
exit(1);
// or
die('Message');
}
}
fare questo:
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);
}
}
In questo modo si può facilmente prendere in giro il metodo terminate
e non devi preoccuparti per il script che termina senza che tu sia in grado di catturarlo.
Il test sarebbe simile a questa:
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();
}
}
Non ho ancora testato il codice ma dovrebbe essere abbastanza vicino a uno stato funzionante.
Sì, ora ho deciso di lanciare un'eccezione. Il problema è che il mio gestore di eccezioni predefinito ha lo scopo di chiamare questa funzione, quindi devo creare una nuova eccezione chiamata killProgramException che il mio gestore di eccezioni ignora. Tipo di hacking –