У меня есть эта функция, которую я хочу протестировать следующим образом:
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 ()» (или любое другое соответствующее исключение), как вы можете тогда
Но я также спрашиваю себя, должно ли выполнение останавливаться при вызове регистратора