我正在写某种递归解析器。最简单的形式是:

  • 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路径映射到文件固定路径?

    10-06 08:39