2013-09-25 32 views
0

我是TDD和phpunit的新手。用phpunit測試PHP_SAPI!='cli'代碼

我測試代碼,基於它叉的執行方法:

if (PHP_SAPI!='cli') { 
    header('HTTP/1.1 '.$statusCode); 
} 

我希望得到儘可能多的代碼覆蓋率可能的,但我似乎無法測試這個部分(因爲PHPUnit的是測試通過命令行界面)。

有沒有辦法解決這個問題?或者另一種方式來測試這部分?

我曾想過嘗試捲曲什麼的,但測試運行的地方與用戶測試系統相關。

+1

你居然發現了一個代碼的氣味。相反,您應該將此作爲該代碼*或*兩個實現的注入參數,一個用於CLI,一個用於HTTP,因此您可以測試這兩個單元。如果這不是你的代碼,你不需要單元測試它。 – hakre

+0

順便說一句,如果你要做TDD(在編寫代碼之前編寫測試),你首先不會遇到這個問題。作爲補充說明,爲了讓TDD術語更清晰一點,我沒有判斷,我花了相當長的一段時間,直到我意識到首先編寫測試的好處。 – hakre

回答

0

摘要,比較成其自己的方法。在您的測試中嘲笑該方法以控制它是否進入該塊。

if ($this->_isCli()) { 
    header('HTTP/1.1 '.$statusCode); 
} 

protected function _isCli() { 
    return PHP_SAPI!='cli'; 
} 
0

如果使用Mockery包,則不能模擬受保護的方法。這裏是一個開發者的評論 - >Calling a mocked protected method

但是如果你使用php_sapi_name原生功能,您仍然可以創建一個有效的測試

此後,您可以在您的測試創建具有相同名稱的虛擬函數(在相同的命名空間內)返回任何值。

使用PHPUnit中的擴展嘲笑靜態和本地函數 - >phpunit-mockfunction