Запрет выводить сообщения error_log() на терминал во время тестов

Как следует из названия, я с нетерпением жду возможности найти способ предотвратить error_log() сообщение, которое будет напечатано в терминале во время моего PHPUnit тесты.

В приведенном выше примере тестируемый метод проходит через error_log("Не показывать"), печатая свое сообщение между тестами.

Есть ли способ предотвратить такое поведение, чтобы сохранить мой тестовый журнал? Кроме того, есть ли способ перехватить сообщение и проверить его вывод? (для случаев, когда сообщение не является простой строкой).

2 ответа

Решение

Есть ли способ предотвратить такое поведение, чтобы сохранить мой тестовый журнал? Кроме того, есть ли способ перехватить сообщение и проверить его вывод? (для случаев, когда сообщение не является простой строкой).

Прежде всего, то, что вы видите, это не тестовый журнал. Отображаемое сообщение об ошибке фактически находится в стандартном потоке ошибок, а не в стандартном потоке вывода. То, что вы видите, не имеет большого значения, так как терминал показывает, что оба смешаны, запись в файл не будет регистрировать это сообщение об ошибке.

Это б / с error_log() записывает сообщение об ошибке в настроенный лог-файл (PHP error_log директива INI). Поскольку Phpunit работает с CLI-версией PHP (в командной строке), это по умолчанию является указанным стандартным потоком ошибок.

Он также содержит всю необходимую информацию, чтобы не выводить ее в стандартный поток ошибок, а захватить ее, например, временно для теста:

$capture = tmpfile();
$saved = ini_set('error_log', stream_get_meta_data($capture)['uri']);
error_log("Test for this message");
ini_set('error_log', $saved);
var_dump(stream_get_contents($capture));

Это обеспечит вывод содержимого через error_log() и через временный файл:

string(59) "[06-Jul-2017 12:14:45 Europe/Amsterdam] Test for this message
"

Временный файл удаляется автоматически, когда заканчивается тест-кейс.

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

Вы можете поместить это в свой загрузочный файл phpunit, и это должно сработать.

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

вы можете установить путь к файлу журнала ошибок, как показано ниже:

ini_set("error_log", "log_file_name.log");

Вы можете указать абсолютный путь, например

/tmp/logs/script_output.log

или относительный путь.

Другие вопросы по тегам