Это, очевидно, старый вопрос, но я предлагаю перенести код, который die()
, в отдельный метод, который затем можно смоделировать.
Например, вместо этого:
class SomeClass
{
public function do()
{
exit(1);
// or
die('Message');
}
}
сделать это:
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);
}
}
Таким образом, вы можете легко насмехаться над методом terminate
, и вам не придется беспокоиться о завершении скрипта, если вы не сможете его перехватить.
Ваш тест будет выглядеть примерно так:
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();
}
}
Я не тестировал код, но должен быть довольно близко к рабочему состоянию.