2016-10-01 45 views
1

我有一個相當脆弱的PHP應用程序,我正在重構併爲我添加phpunit測試。應用程序中的一個常見情況是用戶警告消息的錯誤配置(應用程序接收配置文件並生成圖像和HTML作爲輸出)。PHPunit - 測試用戶錯誤狀態的最佳實踐(不是例外)

所以我必須通過像應用灑一串代碼:

wm_warn("You can't make a contrast with 'none' - guessing black. [WMWARN43]\n"); 

其中wm_warn其寫入標準錯誤或根據上下文的日誌文件。

如何使用phpunit測試這些警告?

重要的是 - 這不是一個致命的錯誤,所以它是不可能的(AFAIK)用一個例外來代替它,並使用phpunit的「預期異常」功能。

這是一個wm_warn模擬的用例嗎?或者捕獲stderr?或者使用不同的日誌記錄方法來簡化測試(例如log4php)?

回答

1

嘲諷可能是正確的解決方案中,PHPUnit的手冊描述嘲笑這樣:

與測試兩倍驗證 期望,例如斷言一方法被調用替換對象的實踐中,被稱爲嘲笑的是 。

所以你可以觀察到wm_warn被調用,但它沒有執行(沒有任何進入日誌)。

可以PHPUnit的測試雙打話題,顯示了這樣的一個實例(這裏還討論了上述報價)下閱讀更多關於Simple Mocking。你可能會遇到的一個問題是,你可以嘲笑物體,但不是直接的功能 - 這取決於你的應用程序的硬殼:)

+1

謝謝,寫得不錯!當前的日誌函數是一個實際的函數,但我可以很容易地調用一個日誌對象的方法(以便將其全部摺疊爲直接調用日誌記錄對象)。 – AnotherHowie

+0

@AnotherHowie很高興聽到它可以爲你工作! – Katie

1

嘲笑(或更確切地說間諜)將是前進的道路..它可能很難實現,這取決於應用程序(你說它相當硬皮)

函數如何加載?如果可以攔截包含wp_warn函數的相關文件的調用,則可以改爲使用自己的模擬版本,然後可以將調用的參數(即錯誤)記錄到(urgh,shudder) )全局變量是測試用例訪問:

//... 
if (defined('TEST_ENVIRONMENT')) { 
    require_once 'wp_warn-test.php'; 
} else { 
    require_once 'wp_warn.php'; 
} 
//... 

在wp_warn-test.php的:

function wp_warn($error) 
{ 
    $_GLOBALS['SPY_WP_WARN_ERRORS'][] = $error; 
} 

,並在測試:

$this->assertContains("You can't make a contrast with 'none' - guessing black. [WMWARN43]\n", $_GLOBALS['SPY_WP_WARN_ERRORS']); 

這非常醜陋,尤其是在使用全局變量的情況下,但如果它意味着您設法進行測試,那麼您將有更多機會重構它並找到更優雅的解決方案。

+0

wm_warn可以在一個單獨的文件中(它目前不是)。我想我會隨它一起調用全局日誌記錄對象中的方法,然後可以進行模擬和替換。還有一些其他的loglevels(調試,跟蹤)也應該在一個地方處理。我已經想過要有某種LogObjectFactory,因此在非調試模式下,debug()調用盡可能短,而不同的日誌對象具有存根函數。 – AnotherHowie