Невозможно сделать это в рамках одного испытания. Это возможно, если вы разбили тестирование возвращаемого значения и уведомление на два разных теста.
Обработчик ошибок PHPUnit ловит ошибки и уведомления PHP и преобразует их в Исключения - которые по определению прекращают выполнение программы. Функция, которую вы тестируете, никогда не возвращается вообще. Тем не менее, вы можете временно отключить преобразование ошибок в исключения, даже во время выполнения.
Это, вероятно, проще с примером, так, вот что эти два испытание должно выглядеть следующим образом:
public function testLoadFileTriggersErrorWhenFileNotFound()
{
$this->setExpectedException('PHPUnit_Framework_Error_Warning'); // Or whichever exception it is
$result = load_file('/some/non-existent/file');
}
public function testLoadFileRetunsFalseWhenFileNotFound()
{
PHPUnit_Framework_Error_Warning::$enabled = FALSE;
$result = load_file('/some/non-existent/file');
$this->assertFalse($result);
}
Это также имеет дополнительный бонус сделать ваши испытания более ясным, более чистый и документированы.
Re: Комментарий: Это отличный вопрос, и я понятия не имел, пока не проведу пару тестов. Похоже, что это будет не восстановить значение по умолчанию/исходное значение, по крайней мере, начиная с PHPUnit 3.3.17 (текущий стабильный выпуск прямо сейчас).
Так что, я бы на самом деле изменить выше, чтобы выглядеть так:
public function testLoadFileRetunsFalseWhenFileNotFound()
{
$warningEnabledOrig = PHPUnit_Framework_Error_Warning::$enabled;
PHPUnit_Framework_Error_Warning::$enabled = false;
$result = load_file('/some/non-existent/file');
$this->assertFalse($result);
PHPUnit_Framework_Error_Warning::$enabled = $warningEnabledOrig;
}
Re: Второй комментарий:
Это не совсем верно. Я смотрю на обработчик ошибок PHPUnit, и она работает следующим образом:
- Если это
E_WARNING
, используйте PHPUnit_Framework_Error_Warning
как класс исключений.
- Если это
E_NOTICE
или E_STRICT
ошибка, используйте PHPUnit_Framework_Error_Notice
- Else, используйте
PHPUnit_Framework_Error
как класс исключений.
Так что, да, ошибки в E_USER_*
не превращались в * _Warning PHPUnit или * _Notice класса, они по-прежнему преобразуются в общий PHPUnit_Framework_Error
исключения.
Дальнейшие мысли
Хотя это зависит именно от того, как используется функция, я бы, вероятно, переключиться на метания фактического исключения вместо запуска ошибки, если бы это было. Да, это изменит логический поток метода и код, который использует этот метод ... прямо сейчас выполнение не останавливается, когда он не может прочитать файл. Но это зависит от вас, чтобы решить, действительно ли запрошенный файл не существует исключительное поведение. Я предпочитаю использовать исключения больше, чем ошибки/предупреждения/уведомления, потому что их легче обрабатывать, тестировать и работать в потоке приложения. Я обычно резервирую уведомления о таких вещах, как вызовы с обесцененными вызовами и т. Д.
Спасибо, Джейсон. Вы случайно не знаете, автоматически ли возвращается значение PHPUnit_Framework_Error_Warning :: $, которое было проверено между тестами? Или вам нужно вручную изменить его на исходное значение? – dellsala
Примечание о этот ответ. Хотя он работает с ошибками, создаваемыми встроенными функциями и методами php, он, похоже, не работает для генерируемых пользователем типов ошибок (E_USER_WARNING и E_USER_NOTICE) trigger_error. Похоже, PHPUnit не поддерживает их переключение во время выполнения (версия 3.3.17) – dellsala