Подтвердить что ты не робот

Игнорирование предупреждений PHP в PHPUnit

Я использую PHPUnit для модульного тестирования моих функций, когда когда-либо появляется какое-либо предупреждение в коде, тест script не будет выполняться для этих функций, может ли кто-нибудь сказать мне, как игнорировать предупреждения и продолжить тестирование

4b9b3361

Ответ 1

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

По умолчанию PHPUnit преобразует ошибки PHP, предупреждения и уведомления, которые срабатывают во время выполнения теста, в исключение.

См. Тестирование ошибок PHP, в котором содержится дополнительная информация о том, как проверять свои предупреждения (и как игнорировать предупреждения в подпрограммах, которые вы вызываете в тестах).

Чтобы отключить поведение по умолчанию, вы можете указать PHPUnit сделать это в ваших тестах, например, в setUp вашего теста или самого теста, установив статическую переменную в глобальном пространстве имен:

# Warning:
PHPUnit_Framework_Error_Warning::$enabled = FALSE;

# notice, strict:
PHPUnit_Framework_Error_Notice::$enabled = FALSE;

Другой вариант изменить поведение по умолчанию - настроить тестировщик на XML файл со следующими параметрами:

<phpunit convertErrorsToExceptions="false"
         convertNoticesToExceptions="false"
         convertWarningsToExceptions="false">
</phpunit>

Эти три параметра недоступны в качестве параметров командной строки.

См. также связанный вопрос: проверьте возвращаемое значение метода, который вызывает ошибку с помощью PHPUnit.

Ответ 2

Документированная стратегия для этого на уровне проверки заключается в использовании оператора подавления ошибок @, когда ваш тест вызывает функцию, которая вызывает предупреждение или уведомление.

Следующий код - это пример из документации PHPUnit:

<?php
class ErrorSuppressionTest extends PHPUnit_Framework_TestCase
{
    public function testFileWriting() {
        $writer = new FileWriter;
        $this->assertFalse(@$writer->write('/is-not-writeable/file', 'stuff'));
    }
}
class FileWriter
{
    public function write($file, $content) {
        $file = fopen($file, 'w');
        if($file == false) {
            return false;
        }
        // ...
    }
}

Ответ 3

Вы не должны игнорировать предупреждения, они есть по причине. Сказав это, предупреждения и уведомления не должны быть фатальными (они были бы ошибкой, если бы они были фатальными).

Вместо того, чтобы игнорировать предупреждение, вы должны проверить его в модульном тесте. Это можно сделать с помощью Netsilik/BaseTestCase (лицензия MIT). С помощью этого расширения к PHPUnit вы можете напрямую проверять наличие запущенных ошибок/предупреждений, не преобразовывая их в исключения:

composer require netsilik/base-test-case


Тестирование для E_USER_NOTICE:

<?php
namespace Tests;

class MyTestCase extends \Netsilik\Testing\BaseTestCase
{
    /**
     * {@inheritDoc}
     */
    public function __construct($name = null, array $data = [], $dataName = '')
    {
        parent::__construct($name, $data, $dataName);

        $this->_convertNoticesToExceptions  = false;
        $this->_convertWarningsToExceptions = false;
        $this->_convertErrorsToExceptions   = true;
    }

    public function test_whenNoticeTriggered_weCanTestForIt()
    {
        $foo = new Foo();
        $foo->bar();

        self::assertErrorTriggered(E_USER_NOTICE, 'The warning string');
    }
}

Надеюсь, это поможет кому-то в будущем.