如何模拟 http.Client Do 方法

新手上路,请多包涵

我试图找到一种解决方案来编写测试和模拟 HTTP 响应。在我接受接口的函数中:

 type HttpClient interface {
    Do(req *http.Request) (*http.Response, error)
}

我使用 base auth 发出 http get 请求

func GetOverview(client HttpClient, overview *Overview) (*Overview, error) {

    request, err := http.NewRequest("GET", fmt.Sprintf("%s:%s/api/overview", overview.Config.Url, overview.Config.Port), nil)
    if (err != nil) {
        log.Println(err)
    }
    request.SetBasicAuth(overview.Config.User, overview.Config.Password)
    resp, err := client.Do(request)

我怎样才能模拟这个 HttpClient?我正在寻找模拟库,例如: https ://github.com/h2non/gock 但只有 Get 和 Post 的模拟

也许我应该以不同的方式来做。我会很感激你的建议

原文由 quentino 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 894
2 个回答

任何具有与您在接口中具有的签名匹配的方法的结构都将实现该接口。例如,您可以创建一个结构 ClientMock

 type ClientMock struct {
}

用方法

func (c *ClientMock) Do(req *http.Request) (*http.Response, error) {
    return &http.Response{}, nil
}

然后你可以将这个 ClientMock 结构注入你的 GetOverview func。 是 Go Playground 中的示例。

原文由 Gavin 发布,翻译遵循 CC BY-SA 3.0 许可协议

net/http/httptest 包是你最好的朋友:

 // generate a test server so we can capture and inspect the request
testServer := httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
    res.WriteHeader(scenario.expectedRespStatus)
    res.Write([]byte("body"))
}))
defer func() { testServer.Close() }()

req, err := http.NewRequest(http.MethodGet, testServer.URL, nil)
assert.NoError(t, err)

res, err := http.DefaultClient.Do(req)
assert.NoError(t, err)
assert.Equal(t, scenario.expectedRespStatus, res.StatusCode, "status code should match the expected response")

原文由 rocketspacer 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题