ฉันกำลังเรียนรู้ไปด้วยการเข้ารหัสโปรเจ็คต์ส่วนตัวขนาดเล็ก แม้ว่ามันจะเล็ก แต่ฉันก็ตัดสินใจทำการทดสอบหน่วยอย่างเข้มงวดเพื่อเรียนรู้นิสัยที่ดีใน Go ตั้งแต่เริ่มต้น
การทดสอบหน่วยเล็กน้อยได้ทั้งหมดดีและโอชะ แต่ฉันงงกับการอ้างอิงในขณะนี้ ฉันต้องการที่จะสามารถแทนที่การเรียกฟังก์ชั่นบางอย่างด้วยการจำลอง นี่คือตัวอย่างรหัสของฉัน:
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 ()
ฉันพบกระทู้นี้: https://groups.google.com/forum/#!topic/golang-nuts/6AN1E2CJOxIซึ่งดูเหมือนว่าจะมีปัญหาที่คล้ายกัน Julian Phillips นำเสนอห้องสมุด Withmock ( http://github.com/qur/withmock ) เป็นวิธีแก้ปัญหา แต่ฉันไม่สามารถใช้งานได้ นี่คือส่วนที่เกี่ยวข้องของรหัสการทดสอบของฉันซึ่งส่วนใหญ่เป็นรหัสลัทธิขนส่งสินค้าให้ฉันตามจริง:
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
}
ผลการทดสอบมีดังต่อไปนี้:
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 เป็นทางออกสำหรับปัญหาการทดสอบของฉันหรือไม่? ฉันควรทำอย่างไรเพื่อให้มันใช้งานได้