2015-11-05 45 views
0

我有一個函數,其他人寫道,它在函數內部創建一個cURL包裝對象。以下簡體版本功能結構與單元測試私有函數

public function getCodes() 
{ 
    //do some stufff 

    $communicator = new Communicator(); 
    $result = $communicator->call($this->API_KEY); 

    //do some stuff with $result 
} 

我的任務是學習PHPUnit併爲此類代碼編寫測試。在這樣做時,我發現當在函數內部創建對象時,測試這樣的函數是非常困難的,並且測試不應該需要任何外部通信工作。

我們希望儘可能多的項目將我們的測試推到git上,但我們不希望意外或故意將我們的API憑據推送到git。

所以我的解決方案是保持getCodes()公開,但使它成爲接受Communicator對象作爲參數的私有函數的包裝。然後我可以使用模擬Communicator對象來測試私有方法。

但是這意味着getCodes永遠不會被測試(我的老闆想要100%的代碼覆蓋率),而且我也讀過你不應該在大多數情況下爲私有函數編寫測試。

所以我的問題基本上是,我該如何使用API​​調用爲這樣的函數編寫測試。

+0

我沒有看到你的解決方案有什麼問題。代碼經過測試,不是嗎? :) – ZhongYu

+0

是的,但我不想實施黑客,如果我不需要或者如果有更好的方法。 – Ethan22

+0

它真的是一個黑客。您重構了您的代碼,並且新代碼在設計方面很有意義。 – ZhongYu

回答

1

我真的會建議重寫代碼來通過構造函數注入Communicator對象。 如果您已經看到在編寫測試中遇到一個大問題,那麼重新執行當前的實現是一個非常強烈的信號。

另一件事是你不應該測試你的私人。塞巴斯蒂安貝格曼在他的博客上寫了一篇關於這個帖子的文章,結論是 - 可能只是不好(https://sebastian-bergmann.de/archives/881-Testing-Your-Privates.html)。

完全不同的是我認爲你的測試不應該超出系統的界限。那就是 - 嘲笑連接到外部系統的所有東西。從運行測試的唯一角度來看,這種測試可能會因各種原因而失敗。

你也提到了報道。不幸的是,這是我希望每個人都會同意的 - 在開始使用原生PHP資源的時候你就不能擁有它(像FS這樣的小例外)。你必須明白諸如curl,ssh,ftp等不能被單元測試。