C'est évidemment une vieille question mais ma suggestion serait de déplacer le code die()
dans une méthode séparée que vous pouvez alors mocker.
À titre d'exemple, au lieu d'avoir ceci:
class SomeClass
{
public function do()
{
exit(1);
// or
die('Message');
}
}
faire ceci:
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);
}
}
De cette façon, vous pouvez facilement se moquer de la méthode terminate
et vous n'avez pas à vous soucier de la script se terminant sans que vous puissiez l'attraper.
Votre test ressemblerait à quelque chose comme ceci:
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();
}
}
Je ne l'ai pas testé le code, mais devrait être assez proche d'un état de fonctionnement.
Oui, en ce moment j'ai décidé de lancer une exception. Le problème est mon gestionnaire d'exceptions par défaut est destiné à appeler cette fonction, donc je dois créer une nouvelle exception appelée killProgramException que mon gestionnaire d'exception ignore. Genre de hacky –