我有一个名为 user-service.go 的文件和相应的测试文件,名为 user-service_test.go。当我试图获得完整的代码覆盖率时,我正在努力让一些错误条件真正发生。
这是函数:GetOrCreateByAccessToken()
//GetOrCreateByAccessToken gets a user from the database with the given access token
func (s *service) GetOrCreateByAccessToken(aT string, client *Client) (*user.User, fcerr.FCErr) {
var currentUser user.OauthUser
req, err := http.NewRequest("GET", "https://openidconnect.googleapis.com/v1/userinfo?access_token="+aT, nil)
if err != nil {
return nil, fcerr.NewInternalServerError("Error when setting up the network request")
}
response, err := client.httpClient.Do(req)
if err != nil {
fmt.Println("error when getting the userinfo with the access token")
return nil, fcerr.NewInternalServerError("Error when trying to verify user identity")
}
defer response.Body.Close()
contents, err := io.ReadAll(response.Body)
if err != nil {
return nil, fcerr.NewInternalServerError("Error when trying to read response from Google about user identity")
}
我对测试的主要控制是我可以传入 *Client。
这是测试用例的一部分,我想让 io.ReadAll 抛出一个错误:
h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
//manually return the message google would return on an actual request
w.Write([]byte(googleAPIOKResponse))
})
//Call the testHTTPClient() function defined in the test file to substitute my own HandlerFunc
httpClient, teardown := testHTTPClient(h)
defer teardown()
//Call the real NewClient() from my user-service.go
client := NewClient()
//Substitute the default httpClient for the one I've just set up.
client.httpClient = httpClient
resultingUser, err := userService.GetOrCreateByAccessToken(nU.AccessToken, client)
assert.Nil(t, resultingUser)
assert.NotNil(t, err)
assert.Equal(t, http.StatusInternalServerError, err.Status())
有什么地方我可以编写自己的 .Do() 方法版本,该方法会在响应中放置一些内容,这会导致 io.ReadAll 返回错误?或者是否有更好的方法来仅使用我已经使用的预烘焙响应文本来实现错误?
萧十郎