【问题标题】:Prevent error_log() messages to be printed to the terminal during tests防止在测试期间将 error_log() 消息打印到终端
【发布时间】:2017-07-03 09:40:59
【问题描述】:
正如标题所述,我期待找到一种方法来防止在我的PHPUnit 测试期间在终端中打印error_log() 消息。
在上面的示例中,被测方法通过 error_log('Don\'t show up'),在测试之间打印其消息。
有什么方法可以防止这种行为,让我的测试日志保持花哨?另外,有什么方法可以捕获消息并测试其输出? (对于消息不是简单字符串的情况)。
【问题讨论】:
标签:
php
unit-testing
phpunit
error-log
【解决方案1】:
您可以使用set_error_handler() 定义自己的错误处理程序。在评论 #112881 中,您可以看到一个使用回调的示例,您可以根据自己的需要进行调整,例如记录到文件,简单地忽略或其他。
你可以把它放到你的 phpunit 引导文件中,这样就可以了。
【解决方案2】:
有什么方法可以防止这种行为,让我的测试日志保持花哨?另外,有什么方法可以捕获消息并测试其输出? (对于消息不是简单字符串的情况)。
首先你看到的不是测试日志。 显示的错误消息实际上是在标准错误流上而不是标准输出流上。对于您所看到的,这并没有太大区别,因为终端显示两者混合在一起,记录到文件不会记录该错误消息。
这是 b/c error_log() 将错误消息写入配置的日志文件(PHP 的 error_log ini 指令)。由于 Phpunit 使用 PHP 的 CLI 版本(在命令行上)运行,因此默认情况下这是所述的标准错误流。
这还包含所有需要的信息,不输出到标准错误流而是捕获它,例如暂时做个测试:
$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
"
测试用例结束时会自动删除临时文件。
【解决方案3】:
您应该为您的脚本设置足够的写入权限的日志文件的正确路径。
您可以设置错误日志文件路径如下:
ini_set("error_log", "log_file_name.log");
你可以给出像
这样的绝对路径
/tmp/logs/script_output.log
或相对路径。