为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕斯王 2021-11-29 19:40:31
如何测试错误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}
查看完整描述

2 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

我是否需要将我的函数一分为二,一个将发出请求,另一个将读取正文并返回字节和错误?


第一个被称为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.


查看完整回答
反对 回复 2021-11-29
?
茅侃侃

TA贡献1842条经验 获得超21个赞

基本上是的,除非您在测试时使用net/http/httptest或类似的方式来模拟您的 HTTP 服务器。

但问题是:你真正要测试的是什么?那ioutil.ReadAll()检测错误?但我确信 Go 的 stdlib 的测试套件已经涵盖了这一点。

因此,我会说,在这种特殊情况下,您将为了测试而进行测试。对于此类微不足道的情况,IMO 最好专注于如何进一步处理获取的结果。


查看完整回答
反对 回复 2021-11-29
  • 2 回答
  • 0 关注
  • 279 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信