Saya sedang belajar Go dengan mengkode proyek pribadi kecil. Meskipun kecil, saya memutuskan untuk melakukan pengujian unit yang ketat untuk mempelajari kebiasaan baik di Go sejak awal.
Tes unit sepele semuanya baik-baik saja dan keren, tapi saya bingung dengan ketergantungan sekarang; Saya ingin dapat mengganti beberapa panggilan fungsi dengan yang tiruan. Berikut cuplikan kode saya:
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])
}
}
Saya ingin dapat menguji pengunduh () tanpa benar-benar mendapatkan halaman melalui http - yaitu dengan mengejek get_page (lebih mudah karena hanya mengembalikan konten halaman sebagai string) atau http.Get ().
Saya menemukan utas ini: https://groups.google.com/forum/#!topic/golang-nuts/6AN1E2CJOxI yang tampaknya merupakan masalah serupa. Julian Phillips menyajikan perpustakaannya, Withmock ( http://github.com/qur/withmock ) sebagai solusi, tetapi saya tidak dapat membuatnya berfungsi. Inilah bagian yang relevan dari kode pengujian saya, yang sebagian besar adalah kode pemujaan kargo bagi saya, jujur:
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
}
Output tes berikut:
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
Apakah Withmock solusi untuk masalah pengujian saya? Apa yang harus saya lakukan untuk membuatnya bekerja?