如何模拟 return fixture 内容的许多 url?
How to mock many urls to return fixture content?
我正在编写某种递归解析器。最简单的形式是:
- 从
first link
的页面正文中提取all links
- 对每个 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 客户端,您可以使用往返辅助函数来处理解码、编码、header 等。在您的情况下,也许您可以使往返函数将主机 header 加上 URL 路径映射到文件固定路径中吗?
我正在编写某种递归解析器。最简单的形式是:
- 从
first link
的页面正文中提取all links
- 对每个 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 客户端,您可以使用往返辅助函数来处理解码、编码、header 等。在您的情况下,也许您可以使往返函数将主机 header 加上 URL 路径映射到文件固定路径中吗?