2014-02-15 56 views
0

說我寫的包裝某些第三方的API和我有這樣的方法:是一種只調用其他方法,並沒有別的代碼味道的方法嗎?

public function fetchSomeData() 
{ 
    $url = $this->makeUrl($someArgs); 
    $response = $this->call($url); 
    $this->save($response); 

    return $response; 
} 

這是一個代碼氣味和不好的設計一般(考慮到我要測試這一點,所有的裏面的方法是私人的),如果是什麼會是一些很好的方法來重構這個?

回答

1

沒有,這些東西不是活得不一定代碼味道。您可能一定要將一些相關的調用分組到一個方法中,以使其更易於使用。

你不應該試圖測試private方法,只有那些public(因爲private方法實際上只是通過分割起來更加容易讀取的public方法)。

我不知道PHP,但在我看來,你試圖做一個webrequest,你以某種方式保存響應。
這裏重要的第一件事是你必須使它成爲一個單元測試而不是集成測試(集成測試也很重要,但它被標記爲單元測試)。集成測試與代碼之外的一些底層系統進行交互:文件系統,當前日期時間,web請求,數據庫等。

一個很好的解決方案是創建一個接口,由您的數據源繼承(本例中的webrequest )。

interface IDataSource { 
    public function MakeUrl($args); 
} 

現在,您可以通過構造函數或設置器使用依賴注入將數據源注入到類中。

至於你如何測試這個問題:你不測試私有方法。創建一個測試,將您的虛假IDataSource注入到類中,使用您的參數調用它並查看它返回的內容,並根據它執行斷言。

0

說你是否編寫一套通用的方法來處理一些API,而不是在類內部創建執行一些API操作的函數。

並創建一個單獨的文件,如控制器文件。 並在此控制器文件中創建API類的對象,並在您需要時根據您的業務邏輯調用其方法。

所以不是

public function fetchSomeData() 
{ 
    $url = $this->makeUrl($someArgs); 
    $response = $this->call($url); 
    $this->save($response); 

    return $response; 
} 

你應該創建一個PHP文件和類似

$obj = new APIClass(); 

創建對象,比做這樣

$url = $obj->makeUrl($someArgs); 
$response = $obj->call($url); 
$obj->save($response); 
相關問題