Go 将函数拆分为2个函数以实现测试覆盖率

Go 将函数拆分为2个函数以实现测试覆盖率,go,Go,如何测试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()

如何测试
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
}

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

但问题是:你到底在测试什么?
ioutil.ReadAll()
检测到错误吗?但我相信Go的stdlib测试套件已经涵盖了这一点


因此,我要说,在这个特殊的情况下,为了测试,您将要进行测试。对于这种琐碎的情况,最好专注于如何进一步处理获取的结果。

基本上是的,除非在测试时使用或类似的方式模拟HTTP服务器

但问题是:你到底在测试什么?
ioutil.ReadAll()
检测到错误吗?但我相信Go的stdlib测试套件已经涵盖了这一点

因此,我要说,在这个特殊的情况下,为了测试,您将要进行测试。在我看来,对于这种琐碎的情况,最好专注于如何进一步处理获取的结果

我是否需要将函数分成两部分,一部分发出请求,另一部分读取正文并返回字节和错误

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
}
第一个名为
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)
}
如果要测试任何内容,请同时使用
http.Get
ioutil.ReadAll
执行
fetchURL
函数。我个人不会费心直接测试它,但如果您坚持,您可以为单个测试覆盖
http.DefaultTransport
,并提供您自己的,它返回
http.Response
,body实现一些错误场景(例如,和body读取期间的错误)

以下是草图的想法:

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.
我是否需要将函数分成两部分,一部分发出请求,另一部分读取正文并返回字节和错误

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
}
第一个名为
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)
}
如果要测试任何内容,请同时使用
http.Get
ioutil.ReadAll
执行
fetchURL
函数。我个人不会费心直接测试它,但如果您坚持,您可以为单个测试覆盖
http.DefaultTransport
,并提供您自己的,它返回
http.Response
,body实现一些错误场景(例如,和body读取期间的错误)

以下是草图的想法:

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.