基本上我已經開始在Riot Games API的包裝上工作了,我正在努力如何測試它。我已經將存儲庫插入到Travis中,所以它推動它運行go test
,但我不知道如何去測試它,因爲請求所需的API_KEY每天都會更改,我無法自動重新生成它,我會如果我直接測試端點,則每天手動添加它。我會如何測試這種方法?
所以我想知道是否有可能嘲笑的反應,但在這種情況下,我猜我需要重構我的代碼?
所以我做了一個結構來代表他們的SummonerDTO
type Summoner struct {
ID int64 `json:"id"`
AccountID int64 `json:"accountId"`
ProfileIconID int `json:"profileIconId"`
Name string `json:"name"`
Level int `json:"summonerLevel"`
RevisionDate int64 `json:"revisionDate"`
}
這結構有一個方法:
func (s Summoner) ByName(name string, region string) (summoner *Summoner, err error) {
endpoint := fmt.Sprintf("https://%s.api.riotgames.com/lol/summoner/%s/summoners/by-name/%s", REGIONS[region], VERSION, name)
client := &http.Client{}
req, err := http.NewRequest("GET", endpoint, nil)
if err != nil {
return nil, fmt.Errorf("unable to create new client for request: %v", err)
}
req.Header.Set("X-Riot-Token", API_KEY)
resp, err := client.Do(req)
if err != nil {
return nil, fmt.Errorf("unable to complete request to endpoint: %v", err)
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
return nil, fmt.Errorf("request to api failed with: %v", resp.Status)
}
respBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("unable to read response body: %v", err)
}
if err := json.Unmarshal([]byte(respBody), &summoner); err != nil {
return nil, fmt.Errorf("unable to unmarshal response body to summoner struct: %v", err)
}
return summoner, nil
}
是它的結構方法,沒有一個單一的責任的情況下, ,從某種意義上說,它正在構建端點,引發請求並解析響應。我是否需要重構它才能使其可測試,並且在這種情況下,最佳方法是什麼?我應該做一個請求和響應結構,然後測試它們嗎?
要澄清API密鑰使用率是有限的,需要每天重新生成,Riot Games不允許您使用抓取工具來自動重新生成密鑰。我正在使用Travis進行持續集成,所以我想知道是否有方法來模擬請求/響應。
潛在我的方法是錯誤的,仍然在學習。
希望所有人都能提供某種形式的感覺,如果不是,我們很樂意澄清。
感謝您的回覆,對我來說看起來像一個徹底和深思熟慮的過程。在我接受答案之前,會給予其他人一點時間提醒。 – Mikey