2017-07-03 72 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文件中,那應該可以做到。