тестирование error_log с помощью PHPUnit

У меня есть эта функция, которую я хочу протестировать следующим образом:

class Logger { function error($msg){ if (is_string($msg)){ error_log($msg); die($msg); } elseif (is_object($msg)){ error_log($msg.' '.$msg->getTraceAsString()); die('exception'); } else { var_dump($msg); die('error'); } } 

Я хочу проверить эту функцию без регистрации $msg . Есть ли способ определить, работает ли error_log без ведения журнала? Я попытался использовать setExpectedException но я не смог поймать ошибку и продолжал вести журнал.

Очевидным ответом является простая псевдонима / прокси-функция, которая сама называется error_log в классе Logger (которую можно легко высмеять и проверить, чтобы увидеть, что для нее установлено)

Однако для фактической проверки собственной функции error_log (без прокси-сервера в исходном классе), это может быть сделано с пространствами имен. Тест будет определяться как одно и то же пространство имен, как и исходный код, а затем после тестового класса добавьте функцию – в этом случае error_log() – но эта функция также определена в пространстве имен – и так будет выполняться в предпочтение эквивалентно корневому пространству имен из собственных функций.

К сожалению , вы не можете сделать то же самое с die (или его псевдоним, exit ). Они являются «языковыми конструкциями» и не могут быть переопределены, как error_log .

 <?php namespace abc; use abc\Logger; class ThreeTest extends \PHPUnit_Framework_TestCase { public function setUp() { $this->l = new Logger(); } // test code to exercise 'abc\Logger' } // Now define a function, still inside the namespace '\abc'. public function error_log($msg) { // this will be called from abc\Logger::error // instead of the native error_log() function echo "ERR: $msg, "; } 

вы можете использовать фальшивую фреймворк, такую ​​как php-mock (есть и другие), чтобы высмеять вызов error_log (и проверить, вызвана ли она с вашими ожидаемыми параметрами).

К сожалению, вы не сможете использовать это для die-construct, поскольку это не обычная функция, а конструкция anlanguage.

Я бы заменил die () на «throw new \ Exception ()» (или любое другое соответствующее исключение), как вы можете тогда

  • тест на исключенное исключение и
  • может решить в вашем программировании, должно ли прекращение выполнения при вызове регистратора или вы хотите продолжить, завернув вызов в try / catch

Но я также спрашиваю себя, должно ли выполнение останавливаться при вызове регистратора