I have a Go method that makes an http request to an external web page, that I am screen scraping. I have unit tests for when everything works as planned. I can mock the httpclient and set the response to a predefined value. However, I am having trouble creating tests for when things don't work. I want to mock http.NewRequest to return an error.
I am using httptest and go tool cover.
Method to test:
func (cli *Client) GetSomething(sometext string) (string, error) {
searchURL := strings.Replace(someUrl, "{PERSON_NAME}", url.QueryEscape(sometext), 1)
req, err := http.NewRequest("GET", someUrl, nil)
if err != nil {
// I want to test this scenario
return "", errors.Wrap(err, "failed to build request")
}
resp, err := cli.HTTPClient.Do(req)
if err != nil {
return "", errors.Wrap(err, "request failed")
}
defer resp.Body.Close()
document, err := goquery.NewDocumentFromReader(resp.Body)
if err != nil {
return "", err
}
value:= document.Find(".someclass").Text()
return value, nil
}
Test Method works for the httpclient. Not sure how to mock http.NewRequest to return an error. This would probably never happen, but just to be complete and as an exercise.
func TestGetSomethingFailedReqest(t *testing.T) {
h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
panic("Create error")
})
//TestingHTTPClient is a helper function to create an HTTPClient. Not needed for this test.
httpClient, teardown := test.TestingHTTPClient(h)
defer teardown()
scraperClient := NewClient()
scraperClient.HTTPClient = httpClient
var person= "John Doe"
_, err := scraperClient.GetSomething(person)
assert.Regexp(t, ".*failed to build request", err.Error())
}