如何模拟http.Head()

时间:2015-05-23 13:56:58

标签: unit-testing go mocking

我正在研究来自https://github.com/golang/example/tree/master/outyet的outyet示例项目。 test file未涵盖http.Head(url)返回错误的情况。我想扩展单元测试以涵盖记录错误的if语句(https://github.com/golang/example/blob/master/outyet/main.go#L100)。我想模仿http.Head(),但我不知道该怎么做。怎么办呢?

1 个答案:

答案 0 :(得分:3)

http.Head函数只调用默认HTTP客户端上的Head method(公开为http.DefaultClient)。通过替换测试中的默认客户端,您可以更改这些标准库函数的行为。

特别是,您需要一个设置自定义传输的客户端(实现http.RoundTripper接口的任何对象)。如下所示:

type testTransport struct{}

func (t testTransport) RoundTrip(request *http.Request) (*http.Response, error) {
    # Check expectations on request, and return an appropriate response
}

...

savedClient := http.DefaultClient
http.DefaultClient = &http.Client{
    Transport: testTransport{},
}

# perform tests that call http.Head, http.Get, etc

http.DefaultClient = savedClient

您还可以使用此技术通过从传输中返回错误而不是HTTP响应来模拟网络错误。