Нет необходимости проверять PHP-функцию set_error_handler()
. Вам важно только то, что ваш класс обработки ошибок работает. Оставьте тестирование интерпретатора PHP разработчикам PHP. :) Относитесь к своему классу как к любому другому классу: создайте его экземпляр и вызовите его методы, передав параметры для проверки различных условий.
Например, допустим, ваш обработчик ошибок выглядел примерно так:
class ErrorHandler
{
private $logger;
private $mode;
public function __construct($mode, $logger) {
$this->mode = $mode;
$this->logger = $logger;
}
public function handleError($code, $message, $file='', $line=0, $context=array()) {
if ($code = E_WARNING && $this->mode == 'dev') {
// warnings are logged in development mode
$this->logger->log($message, Logger::WARN);
}
...
}
}
Вы можете использовать фиктивный регистратор, чтобы протестировать вышеуказанную функцию, не вызывая set_error_handler()
и не вызывая фактическую ошибку PHP. Вместо этого сделайте вызов вашего обработчика ошибок так же, как PHP сделал бы при следующих условиях:
function testWarningsAreLoggedInDevelopment() {
$logger = $this->getMock('Logger', array('log'));
$logger->expects($this->once())
->method('log')
->with('message', Logger::WARN);
$handler = new ErrorHandler('dev', $logger);
$handler->handleError(E_WARNING, 'message');
}
Прелесть в том, что если ваш обработчик ошибок вызывает ошибку PHP из-за ошибки, PHPUnit перехватит ее и провалит тест. Если вы замените обработчик PHPUnit своим собственным, вы, вероятно, войдете в бесконечный цикл, поскольку PHP снова и снова вызывает ваш обработчик, пока интерпретатор не умрет из-за переполнения стека или из-за нехватки памяти.