go - 如何模拟多个 url 以返回夹具内容?
问题描述
我正在编写某种递归解析器。最简单的形式是:
- 取自
all links
的first link
页面正文 - 对每个链接重复第一步
所以现在我想测试它。问题是我想不出模拟所有这些页面的最佳方法。我使用http
包,并且我已经使用httptest
包(通过httptest.NewServer
)编写了一些测试。但现在对我的任务似乎没有用。我想最好的方法是使用http.Client
自定义Transport
结构,但它有很多样板和额外的臭代码。有没有更优雅的方法来做到这一点?
解决方案
我曾多次使用自定义Transport
来测试客户。通常我会创建一些辅助类型和函数来减少样板代码。
这样的事情可能是一个开始。
package main
import (
"bytes"
"fmt"
"io"
"io/ioutil"
"net/http"
"os"
)
type roundTripFunc func(*http.Request) (*http.Response, error)
func (r roundTripFunc) RoundTrip(req *http.Request) (resp *http.Response, err error) {
return r(req)
}
func main() {
c := &http.Client{
Transport: roundTripFunc(func(req *http.Request) (resp *http.Response, err error) {
return &http.Response{
StatusCode: 200,
Body: ioutil.NopCloser(bytes.NewBufferString("test")),
}, nil
}),
}
r, _ := c.Get("/")
fmt.Printf("%#v\n", r)
io.Copy(os.Stdout, r.Body)
}
例如,如果您测试 JSON API 客户端,您可以制作一个往返帮助函数来处理解码、编码、标头等。在您的情况下,也许您可以将往返函数映射主机标头和 URL 路径到文件固定路径?
推荐阅读
- node.js - 如何修复节点 js 中的路由不起作用?
- mongodb - MongoDB - 编辑嵌套列表
- android - RecyclerView kotlin 不记得选中的项目,添加下一个项目后
- swift - Swift ui macos 背景透明TextField
- azure - 如何在 Azure 资源管理器模板中配置 Azure 函数以使用 Azure B2C?
- node.js - 微软团队 | Microsoft bot 框架 - 在任务/获取上返回 502 错误
- python - 将变量传递给 eval
- python - 如何从我的数据框中删除 \xa0$?
- python - 电子邮件python中没有excel文件附件
- html - 如何将深度嵌套列表缩小到窗口中剩余的空间,以便页面不滚动但列表缩小并且可以滚动