【发布时间】:2017-12-19 21:32:51
【问题描述】:
基本上,我已经开始为 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 进行持续集成,所以我想知道是否有办法模拟请求/响应。
可能我的方法是错误的,仍在学习中。
希望这一切都有意义,如果没有,很高兴澄清。
【问题讨论】:
标签: testing go automated-tests