如何在golang中将url注入到httptest.server?

Pin*_*ple 7 unit-testing go gomock

对于句子

resp, err := client.Get(fmt.Sprintf("https://www.xxxxx/day?time=%s", time))
Run Code Online (Sandbox Code Playgroud)

如果我想在单元测试中模拟对此 client.Get() 的响应,我应该使用 httptest.server,但是如何将 url ( https://www.xxxxx/day?time=%s ) 绑定到httptest.server 的 url?这样当我调用 client.Get() 时它可以返回我之前设置的响应。由于某种原因,我不能在这里嘲笑客户。

And*_*rew 0

http.Client 是一个结构而不是一个接口,这使得模拟变得很困难,正如您所看到的。模拟它的另一种方法是传递例程所需的外部依赖项,因此您不直接使用 client.Get,而是使用 clientGet - 这是传递到例程中的函数指针。

然后您可以从单元测试中创建:

mockClientGet(c *http.client, url string) (resp *http.Response, err error) {
// add the test code to return what you want it to.
}
Run Code Online (Sandbox Code Playgroud)

然后在您的主代码中使用:

resp, err := clientGet(client, fmt.Sprintf("https://www.xxxxx/day?time=%s", time))
Run Code Online (Sandbox Code Playgroud)

正常调用过程时,使用指向 http.Client.Get 的函数指针,并在测试中传递指向模拟的指针。这并不理想,但我还没有看到更好的方法来模拟非接口外部调用 - 并且考虑到它的外部依赖性,从外部注入它并不是一件坏事。