dousao8152
2019-06-18 09:32
浏览 164
已采纳

使用github.com/jarcoal/httpmock验证请求正文

The function I am trying to test accepts data structs, forms a query_dsl and then makes a /_search call to elastic search with the formed query. Hence I want to assert on the query_dsl and url which gets formed.

I am using github.com/jarcoal/httpmock to mock net/http requests in my unit tests. As per the doc it exposes func GetCallCountInfo() map[string]int to validate how many times a particular endpoint was hit. But I am also interested in knowing what was the request body when this call was made.

http.Client is not exposed, hence can not override/mock that for testing.

If it is not possible using this package then is there any other library which can mock the network request and also gives hold of request body?

图片转代码服务由CSDN问答提供 功能建议

我要测试的函数接受数据结构,形成 query_dsl ,然后使 一个 / _ search 调用,以对形成的查询进行弹性搜索。 因此,我想对形成的 query_dsl url 进行断言。

我在单元测试中使用 github.com/jarcoal/httpmock 来模拟 net / http 请求。 根据文档,它会公开 func GetCallCountInfo()map [string] int 来验证特定端点被击中了多少次。 但是我也想知道调用此请求时请求主体是什么

http.Client 未公开,因此无法覆盖/模拟该代码以进行测试。

如果 无法使用此软件包,那么还有其他库可以模拟网络请求并保留请求正文吗?

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • dsmlf1207915 2019-06-19 03:26
    已采纳

    Following @georgeok Suggestion, We can create a mock http server and capture the request body when request is made. Following is the code snippet to create a server and store the request body.

    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()
    

    Now our request body is stored on actualRequestBody variable, and we can assert on this for correctness.

    The only thing necessary to make sure this works is to make the call at host server.URL. As it spins up a server on the address mentioned at server.URL. So if the call from your code is being made to different server this will not catch it.

    已采纳该答案
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题