简体   繁体   中英

Validate request Body using 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?

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM