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() 时它可以返回我之前设置的响应。由于某种原因,我不能在这里嘲笑客户。
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 的函数指针,并在测试中传递指向模拟的指针。这并不理想,但我还没有看到更好的方法来模拟非接口外部调用 - 并且考虑到它的外部依赖性,从外部注入它并不是一件坏事。
| 归档时间: |
|
| 查看次数: |
6892 次 |
| 最近记录: |