Tôi đang học Đi bằng cách mã hóa một dự án cá nhân nhỏ. Mặc dù nó nhỏ, tôi quyết định thực hiện kiểm tra đơn vị nghiêm ngặt để học thói quen tốt trên Go ngay từ đầu.
Các bài kiểm tra đơn vị tầm thường đều ổn và bảnh bao, nhưng hiện tại tôi đang bối rối với sự phụ thuộc; Tôi muốn có thể thay thế một số cuộc gọi chức năng bằng các cuộc gọi giả. Đây là một đoạn mã của tôi:
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])
}
}
Tôi muốn có thể kiểm tra trình tải xuống () mà không thực sự có được một trang thông qua http - tức là bằng cách chế nhạo get_page (dễ dàng hơn vì nó chỉ trả về nội dung trang dưới dạng chuỗi) hoặc http.Get ().
Tôi tìm thấy chủ đề này: https://groups.google.com/forum/#!topic/golang-nuts/6AN1E2CJOxI dường như là về một vấn đề tương tự. Julian Phillips trình bày thư viện của mình, Withmock ( http://github.com/qur/withmock ) như một giải pháp, nhưng tôi không thể làm cho nó hoạt động được. Đây là những phần có liên quan trong mã thử nghiệm của tôi, phần lớn là mã sùng bái đối với tôi, phải trung thực:
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
}
Đầu ra thử nghiệm như sau:
ERROR: Failed to install '_et/http': exit status 1
output:
can't load package: package _et/http: found packages http (chunked.go) and main (main_mock.go) in /var/folders/z9/ql_yn5h550s6shtb9c5sggj40000gn/T/withmock570825607/path/src/_et/http
Withmock có phải là giải pháp cho vấn đề thử nghiệm của tôi không? Tôi nên làm gì để nó hoạt động?