首页 > 解决方案 > 使用 github.com/jarcoal/httpmock 验证请求正文

问题描述

我尝试测试的函数接受数据结构,形成 aquery_dsl然后/_search使用形成的查询调用弹性搜索。因此,我想断言query_dsland urlwhich 会形成。

github.com/jarcoal/httpmock用来模拟net/http单元测试中的请求。根据文档,它公开func GetCallCountInfo() map[string]int以验证特定端点被击中的次数。但我也有兴趣知道进行此调用时的请求正文是什么。

http.Client没有暴露,因此不能覆盖/模拟测试。

如果无法使用此包,那么是否有任何其他库可以模拟网络请求并保留请求主体?

标签: unit-testinggo

解决方案


按照@georgeok 的建议,我们可以创建一个模拟http 服务器并在发出请求时捕获请求正文。以下是创建服务器并存储请求正文的代码片段。

server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
        actualRequestBody, err = ioutil.ReadAll(req.Body)
        check(err)
        // Send mock response to be tested
        _, err := rw.Write(bytes)
        check(err)
    }))

    defer server.Close()

现在我们的请求正文存储在actualRequestBody变量中,我们可以断言它的正确性。

唯一需要确保它有效的是在 host 上进行调用server.URL。因为它在提到的地址上启动服务器server.URL。因此,如果从您的代码调用不同的服务器,这将不会捕获它。


推荐阅读