unit-testing - 如何模拟http.Head()

原文 标签 unit-testing go mocking

我正在研究https://github.com/golang/example/tree/master/outyet的最佳示例项目。 test file不涵盖 http.Head(url) 返回错误的情况。我想扩展单元测试以覆盖记录错误的if语句(https://github.com/golang/example/blob/master/outyet/main.go#L100)。我想模拟http.Head(),但是我不确定该怎么做。如何才能做到这一点?

最佳答案

http.Head函数仅在默认的HTTP客户端(显示为Head)上调用 http.DefaultClient method。通过替换测试中的默认客户端,可以更改这些标准库功能的行为。

特别是,您将需要一个设置自定义传输的客户端(任何实现 http.RoundTripper 接口(interface)的对象)。类似于以下内容:

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响应来使用此技术来模拟网络错误。

相关文章:

unit-testing - PHPUnit:如何模拟今天的日期而不将其作为参数传递?

reactjs - 开 Jest :TypeError:无法读取未定义的属性

c# - 使用Microsoft EntityFramework进行单元测试

go - 在golang中使用string [] []时,复合文字中的类型丢失

unit-testing - 开 Jest -如何获得关于模拟类和实现的报道

java - 在没有具体实现的情况下以xml配置为接口(interface)创建spring bean

javascript - GO:javascript和html MIME错误

go - 为什么返回具体类型不满足需要接口(interface)返回的接口(interface)

unit-testing - 在Grails单元测试中使用mockDomain之后是否有必要删除metaClass?

perl - perl模拟有一种模拟$的方法吗?