Нет способа сделать это за один юнит-тест. Это возможно, если вы разбиваете тестирование возвращаемого значения и уведомления на два разных теста.
Обработчик ошибок 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
- Иначе, используйте
PHPUnit_Framework_Error
в качестве класса исключения.
Итак, да, ошибки E_USER_*
не превращаются в класс * _Warning или * _Notice PHPUnit, они по-прежнему преобразуются в общее исключение PHPUnit_Framework_Error
.
Дальнейшие мысли
Хотя это зависит именно от того, как используется функция, я, вероятно, переключился бы на выдачу действительного исключения вместо вызова ошибки, если бы это был я. Да, это изменило бы логический поток метода и код, который использует метод ... прямо сейчас выполнение не останавливается, когда он не может прочитать файл. Но вам решать, действительно ли запрошенный файл не существует исключительное поведение. Я склонен использовать исключения гораздо чаще, чем ошибки / предупреждения / уведомления, потому что они легче обрабатываются, тестируются и работают в потоке ваших приложений. Я обычно резервирую уведомления для таких вещей, как устаревшие вызовы методов и т. Д.