2017-07-03 50 views
0

正如标题所述,我期待在我的PHPUnit测试期间找到一种方法来防止在终端中打印error_log()消息。防止在测试期间将error_log()消息打印到终端

enter image description here

在上面的例子中,被测试的方法穿过一个error_log中(“唐\”吨显示'),打印测试之间它的消息。

有什么办法可以防止这种行为,让我的测试日志保持幻想?另外,有没有什么方法可以捕捉消息并测试其输出? (对于消息不是简单字符串的情况)。

回答

1

有什么办法来防止这种行为,让我的测试日志保持幻想?另外,有没有什么方法可以捕捉消息并测试其输出? (对于消息不是简单字符串的情况)。

首先你看到的不是测试日志。 显示的错误消息实际上是标准错误流而不是标准输出流。对于你所看到的,这并没有什么不同,因为终端显示两者混合在一起,记录到文件不会记录该错误消息。

这是b/c error_log()将错误消息写入配置的日志文件(PHP的error_log ini指令)。由于Phpunit使用CLI的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 
" 

与测试例结束时,临时文件被自动删除。

0

您可以使用set_error_handler()来定义自己的错误处理程序。在评论#112881中,您可以看到一个使用回调的示例,您可以根据自己的需要进行调整,例如登录文件,简单地忽略或不管。

你可以把它放到你的phpunit bootstrap文件中,那应该可以做到。