最佳答案
我对依赖性感到困惑。我希望能够用模拟函数替换一些函数调用。下面是我的代码片段:
func get_page(url string) string {
get_dl_slot(url)
defer free_dl_slot(url)
resp, err := http.Get(url)
if err != nil { return "" }
defer resp.Body.Close()
contents, err := ioutil.ReadAll(resp.Body)
if err != nil { return "" }
return string(contents)
}
func downloader() {
dl_slots = make(chan bool, DL_SLOT_AMOUNT) // Init the download slot semaphore
content := get_page(BASE_URL)
links_regexp := regexp.MustCompile(LIST_LINK_REGEXP)
matches := links_regexp.FindAllStringSubmatch(content, -1)
for _, match := range matches{
go serie_dl(match[1], match[2])
}
}
我希望能够测试 downloader()
,而不需要通过 http 实际获取页面-即通过模拟 get_page
(更容易,因为它只返回作为字符串的页面内容)或 http.Get()
。
我发现 这根线似乎是一个类似的问题。朱利安菲利普斯提出了他的库,威斯莫克作为一个解决方案,但我无法得到它的工作。下面是我的测试代码的相关部分,坦白地说,这些代码对我来说很大程度上是货物狂热代码:
import (
"testing"
"net/http" // mock
"code.google.com/p/gomock"
)
...
func TestDownloader (t *testing.T) {
ctrl := gomock.NewController()
defer ctrl.Finish()
http.MOCK().SetController(ctrl)
http.EXPECT().Get(BASE_URL)
downloader()
// The rest to be written
}
测试结果如下:
错误: 未能安装’_ et/http’: 退出状态1输出: 无法加载 Package: package _ et/http: found package http (chunked.go) and main (main _ mock. go)
/var/files/z9/ql _ yn5h550s6shtb9c5sggj40000gn/T/withmock 570825607/path/src/_ et/http
Withmock 是我测试问题的解决方案吗? 我应该怎么做才能让它工作?