我正在尝试测试一个使用net/http
发出请求的方法。具体来说,我试图实现的是注入一个模拟http.Client
,它用特定的JSON主体响应
type clientMock struct{}
func (c *clientMock) Do(req *http.Request) (*http.Response, error) {
json := struct {
AccessToken string `json:"access_token`
Scope string `json:"scope"`
}{
AccessToken: "123457678",
Scope: "read, write",
}
body := json.Marshal(json)
res := &http.Response {
StatusCode: http.StatusOK,
Body: // I haven't got a clue what to put here
}
return res
}
func TestRequest(t *testing.T) { //tests here }
我知道Body
是io.ReadCloser
接口类型。麻烦的是,我找不到一种方法来实现它在模拟身体的React。
到目前为止,here的示例仅演示了返回空白&http.Response{}
4条答案
按热度按时间ijnw1ujt1#
虽然使用
httptest.Server
模拟完整的请求周期可能更有用,但您可以使用ioutil.NopCloser
在任何读取器周围创建更接近的:如果你想要一个空的正文,只需提供一个没有内容的阅读器。
xuo3flqw2#
在测试文件(my_test.go)中:
在你的实现中(main.go):
u0njafvf3#
我知道这是一个小的一段时间,但我只是写了一些东西,以帮助这最近。
像JimB一样,我建议在本地启动一个真实的的HTTP服务器,因为在Go中,这很容易用https://golang.org/pkg/net/http/httptest/来完成。
然而,在做了很多HTTP mocking之后,我想要做得更多一点的东西,就像一个好的mock库一样:返回特定数据、容易地设置期望、验证所有请求都已发出等。我通常使用https://godoc.org/github.com/stretchr/testify/mock进行模拟,并希望具有这样的功能。
所以我写了https://github.com/dankinder/httpmock,它基本上结合了两者。如果您只是想要一个接受JSON并输出JSON的mock,那么这可能是一种更简单的方法。
xhv8bpkk4#
您可以执行以下操作: