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.