将函数拆分为 2 个函数以进行测试覆盖

如何测试错误ioutil.ReadAll(rep.Body)?我是否需要将我的函数一分为二,一个将发出请求,另一个将读取正文并返回字节和错误?


func fetchUrl(URL string) ([]bytes, error) {

  resp, err := http.Get(URL)

  if err != nil {

    return nil, err

  }

  body, err := ioutil.ReadAll(resp.Body)

  resp.Body.Close()

  if err != nil {

    return nil, err

  }

  return body, nil

}


慕斯王
浏览 280回答 2
2回答

慕神8447489

我是否需要将我的函数一分为二,一个将发出请求,另一个将读取正文并返回字节和错误?第一个被称为http.Get另一个ioutil.ReadAll,所以我认为没有什么可以拆分的。您刚刚创建了一个函数,该函数将其他两个函数一起使用,您应该假设这些函数正常工作。您甚至可以简化您的函数以使其更加明显:func fetchURL(URL string) ([]byte, error) {    resp, err := http.Get(URL)    if err != nil {        return nil, err    }    defer resp.Body.Close()    return ioutil.ReadAll(resp.Body)}如果你想测试任何东西是你的fetchURL功能使用http.Get和ioutil.ReadAll一起使用。我个人不会费心直接测试它,但如果你坚持它,你可以覆盖http.DefaultTransport一个单一的测试并提供你自己的,它返回http.Response与实现一些错误场景的主体(例如和主体读取期间的错误)。这是草图的想法:type BrokenTransport struct {}func (*BrokenTransport) RoundTrip(*http.Request) (*http.Response, error) {    // Return Response with Body implementing specific error behaviour}http.DefaultTransport = &BrokenTransport{}// http.Get will now use your RoundTripper.// You should probably restore http.DefaultTransport after the test.

茅侃侃

基本上是的,除非您在测试时使用net/http/httptest或类似的方式来模拟您的 HTTP 服务器。但问题是:你真正要测试的是什么?那ioutil.ReadAll()检测错误?但我确信 Go 的 stdlib 的测试套件已经涵盖了这一点。因此,我会说,在这种特殊情况下,您将为了测试而进行测试。对于此类微不足道的情况,IMO 最好专注于如何进一步处理获取的结果。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go