протестируйте возвращаемое значение метода, который инициировал ошибку с PHPUnit

решение meouw корректно, но если Вы, интересуются большим количеством управления тогда, Вы могли бы попробовать плагин менеджера по Ajax для jQuery.

12
задан dellsala 4 August 2009 в 04:46
поделиться

3 ответа

Невозможно сделать это в рамках одного модульного теста. Это возможно, если вы разделите тестирование возвращаемого значения и уведомления на два разных теста.

Обработчик ошибок 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 _ * не превращаются в PHPUnit ' s * _Warning или * _Notice, они по-прежнему преобразуются в общее исключение PHPUnit_Framework_Error .

Дальнейшие мысли

Хотя это зависит именно от того, как используется функция, я бы, вероятно, переключился на генерацию фактического исключения вместо запуска ошибки, если бы это был я. Да, это изменило бы логику метода и код, который использует метод ... прямо сейчас выполнение не останавливается, когда он не может прочитать файл. Но вам решать, действительно ли запрашиваемый файл не существует исключительным поведением. Я предпочитаю использовать исключения больше, чем ошибки / предупреждения / уведомления, потому что их легче обрабатывать, тестировать и использовать в потоке вашего приложения. Я обычно оставляю уведомления для таких вещей, как вызов устаревших методов и т. Д.

они по-прежнему преобразуются в общее исключение PHPUnit_Framework_Error .

Дальнейшие мысли

Хотя это зависит именно от того, как используется функция, я бы, вероятно, переключился на генерацию фактического исключения вместо того, чтобы вызывать ошибку, если бы это был я. Да, это изменило бы логику метода и код, который использует метод ... прямо сейчас выполнение не останавливается, когда он не может прочитать файл. Но вам решать, действительно ли запрашиваемый файл не существует исключительным поведением. Я предпочитаю использовать исключения больше, чем ошибки / предупреждения / уведомления, потому что их легче обрабатывать, тестировать и работать с потоком вашего приложения. Я обычно оставляю уведомления для таких вещей, как вызов устаревших методов и т. Д.

они по-прежнему преобразуются в общее исключение PHPUnit_Framework_Error .

Дальнейшие мысли

Хотя это зависит именно от того, как используется функция, я бы, вероятно, переключился на генерацию фактического исключения вместо запуска ошибки, если бы это был я. Да, это изменило бы логический поток метода и код, который использует метод ... прямо сейчас выполнение не останавливается, когда он не может прочитать файл. Но вам решать, действительно ли несуществующий запрашиваемый файл является исключительным поведением. Я предпочитаю использовать исключения больше, чем ошибки / предупреждения / уведомления, потому что их легче обрабатывать, тестировать и работать с потоком вашего приложения. Я обычно оставляю уведомления для таких вещей, как вызов устаревших методов и т. Д.

Дальнейшие мысли

Хотя это зависит именно от того, как используется функция, я бы, вероятно, переключился на генерацию фактического исключения вместо запуска ошибки, если бы это был я. Да, это изменило бы логический поток метода и код, который использует метод ... прямо сейчас выполнение не останавливается, когда он не может прочитать файл. Но вам решать, действительно ли несуществующий запрашиваемый файл является исключительным поведением. Я предпочитаю использовать исключения больше, чем ошибки / предупреждения / уведомления, потому что их легче обрабатывать, тестировать и использовать в потоке вашего приложения. Я обычно оставляю уведомления для таких вещей, как вызов устаревших методов и т. Д.

Дальнейшие мысли

Хотя это зависит именно от того, как используется функция, я бы, вероятно, переключился на генерацию фактического исключения вместо того, чтобы вызывать ошибку, если бы это был я. Да, это изменило бы логику метода и код, который использует метод ... прямо сейчас выполнение не останавливается, когда он не может прочитать файл. Но вам решать, действительно ли запрашиваемый файл не существует исключительным поведением. Я предпочитаю использовать исключения больше, чем ошибки / предупреждения / уведомления, потому что их легче обрабатывать, тестировать и использовать в потоке вашего приложения. Я обычно оставляю уведомления для таких вещей, как вызов устаревших методов и т. Д.

если бы это был я. Да, это изменило бы логику метода и код, который использует метод ... прямо сейчас выполнение не останавливается, когда он не может прочитать файл. Но вам решать, действительно ли запрашиваемый файл не существует исключительным поведением. Я предпочитаю использовать исключения больше, чем ошибки / предупреждения / уведомления, потому что их легче обрабатывать, тестировать и использовать в потоке вашего приложения. Я обычно оставляю уведомления для таких вещей, как вызов устаревших методов и т. Д.

если бы это был я. Да, это изменило бы логический поток метода и код, который использует метод ... прямо сейчас выполнение не останавливается, когда он не может прочитать файл. Но вам решать, действительно ли запрашиваемый файл не существует исключительным поведением. Я предпочитаю использовать исключения больше, чем ошибки / предупреждения / уведомления, потому что их легче обрабатывать, тестировать и использовать в потоке вашего приложения. Я обычно оставляю уведомления для таких вещей, как вызов устаревших методов и т. Д.

Я предпочитаю использовать исключения больше, чем ошибки / предупреждения / уведомления, потому что их легче обрабатывать, тестировать и работать с потоком вашего приложения. Я обычно оставляю уведомления для таких вещей, как вызов устаревших методов и т. Д.

Я предпочитаю использовать исключения больше, чем ошибки / предупреждения / уведомления, потому что их легче обрабатывать, тестировать и работать с потоком вашего приложения. Я обычно оставляю уведомления для таких вещей, как вызов устаревших методов и т. Д.

22
ответ дан 2 December 2019 в 04:17
поделиться

Вместо того, чтобы ожидать общего « Exception », как насчет ожидания « PHPUnit_Framework_Error »?

Что-то вроде этого могло бы сделать:

/**
 * @expectedException PHPUnit_Framework_Error
 */
public function testFailingInclude()
{
    include 'not_existing_file.php';
}

Что, я полагаю, можно также записать как:

public function testLoadFile ()
{
    $this->setExpectedException('PHPUnit_Framework_Error');
    $result = load_file('/some/non-existent/file');

    // code after this point never gets executed

    $this->assertFalse($result);
}

Для получения дополнительной информации см. Тестирование ошибок PHP
В частности, там написано (цитируется):

PHPUnit_Framework_Error_Notice и PHPUnit_Framework_Error_Warning представляют Уведомления и предупреждения PHP соответственно.


Глядя на файл /usr/share/php/PHPUnit/TextUI/TestRunner.php, который у меня есть в моей системе, я вижу этот (строка 198 и последующие) :

if (!$arguments['convertNoticesToExceptions']) {
    PHPUnit_Framework_Error_Notice::$enabled = FALSE;
}

if (!$arguments['convertWarningsToExceptions']) {
    PHPUnit_Framework_Error_Warning::$enabled = FALSE;
}

Так что, возможно, вы ' нужно будет передать какой-то параметр, чтобы активировать это поведение? Но вроде по умолчанию включен ...

3
ответ дан 2 December 2019 в 04:17
поделиться

Используйте файл конфигурации phpunit.xml и отключите преобразование уведомления / предупреждения / ошибки в исключение. Подробнее о читайте в инструкции . В основном это примерно так:

<phpunit convertErrorsToExceptions="false"
         convertNoticesToExceptions="false"
         convertWarningsToExceptions="false">
</phpunit>
9
ответ дан 2 December 2019 в 04:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: