Я использую PHPUnit для модульного тестирования моих функций, когда когда-либо появляется какое-либо предупреждение в коде, тест script не будет выполняться для этих функций, может ли кто-нибудь сказать мне, как игнорировать предупреждения и продолжить тестирование
Игнорирование предупреждений PHP в PHPUnit
Ответ 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');
}
}
Надеюсь, это поможет кому-то в будущем.