我是TDD和phpunit的新手。用phpunit測試PHP_SAPI!='cli'代碼
我測試代碼,基於它叉的執行方法:
if (PHP_SAPI!='cli') {
header('HTTP/1.1 '.$statusCode);
}
我希望得到儘可能多的代碼覆蓋率可能的,但我似乎無法測試這個部分(因爲PHPUnit的是測試通過命令行界面)。
有沒有辦法解決這個問題?或者另一種方式來測試這部分?
我曾想過嘗試捲曲什麼的,但測試運行的地方與用戶測試系統相關。
我是TDD和phpunit的新手。用phpunit測試PHP_SAPI!='cli'代碼
我測試代碼,基於它叉的執行方法:
if (PHP_SAPI!='cli') {
header('HTTP/1.1 '.$statusCode);
}
我希望得到儘可能多的代碼覆蓋率可能的,但我似乎無法測試這個部分(因爲PHPUnit的是測試通過命令行界面)。
有沒有辦法解決這個問題?或者另一種方式來測試這部分?
我曾想過嘗試捲曲什麼的,但測試運行的地方與用戶測試系統相關。
摘要,比較成其自己的方法。在您的測試中嘲笑該方法以控制它是否進入該塊。
if ($this->_isCli()) {
header('HTTP/1.1 '.$statusCode);
}
protected function _isCli() {
return PHP_SAPI!='cli';
}
如果使用Mockery包,則不能模擬受保護的方法。這裏是一個開發者的評論 - >Calling a mocked protected method
但是如果你使用php_sapi_name
原生功能,您仍然可以創建一個有效的測試
此後,您可以在您的測試創建具有相同名稱的虛擬函數(在相同的命名空間內)返回任何值。
或
使用PHPUnit中的擴展嘲笑靜態和本地函數 - >phpunit-mockfunction
你居然發現了一個代碼的氣味。相反,您應該將此作爲該代碼*或*兩個實現的注入參數,一個用於CLI,一個用於HTTP,因此您可以測試這兩個單元。如果這不是你的代碼,你不需要單元測試它。 – hakre
順便說一句,如果你要做TDD(在編寫代碼之前編寫測試),你首先不會遇到這個問題。作爲補充說明,爲了讓TDD術語更清晰一點,我沒有判斷,我花了相當長的一段時間,直到我意識到首先編寫測試的好處。 – hakre