2 回答
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.
TA贡献1842条经验 获得超21个赞
基本上是的,除非您在测试时使用net/http/httptest
或类似的方式来模拟您的 HTTP 服务器。
但问题是:你真正要测试的是什么?那ioutil.ReadAll()
检测错误?但我确信 Go 的 stdlib 的测试套件已经涵盖了这一点。
因此,我会说,在这种特殊情况下,您将为了测试而进行测试。对于此类微不足道的情况,IMO 最好专注于如何进一步处理获取的结果。
- 2 回答
- 0 关注
- 279 浏览
添加回答
举报