Ich lerne Go, indem ich ein kleines persönliches Projekt codiere. Obwohl es klein ist, habe ich mich entschlossen, strenge Unit-Tests durchzuführen, um von Anfang an gute Gewohnheiten auf Go zu lernen.
Triviale Unit-Tests waren alle in Ordnung und gut, aber ich bin jetzt verwirrt über Abhängigkeiten. Ich möchte in der Lage sein, einige Funktionsaufrufe durch Scheinaufrufe zu ersetzen. Hier ist ein Ausschnitt aus meinem Code:
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])
}
}
Ich möchte in der Lage sein, downloader () zu testen, ohne tatsächlich eine Seite über http zu erhalten - dh indem ich entweder get_page (einfacher, da nur der Seiteninhalt als Zeichenfolge zurückgegeben wird) oder http.Get () verspotte.
Ich habe diesen Thread gefunden: https://groups.google.com/forum/#!topic/golang-nuts/6AN1E2CJOxI, bei dem es sich anscheinend um ein ähnliches Problem handelt. Julian Phillips präsentiert seine Bibliothek Withmock ( http://github.com/qur/withmock ) als Lösung, aber ich kann sie nicht zum Laufen bringen. Hier sind die relevanten Teile meines Testcodes, der für mich größtenteils Frachtkultcode ist, um ehrlich zu sein:
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
}
Die Testausgabe lautet wie folgt:
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
Ist der Withmock eine Lösung für mein Testproblem? Was soll ich tun, damit es funktioniert?