J'apprends Go en codant un petit projet personnel. Même si c'est petit, j'ai décidé de faire des tests unitaires rigoureux pour apprendre de bonnes habitudes sur Go dès le début.
Les tests unitaires triviaux étaient tous très bien, mais je suis maintenant perplexe avec les dépendances; Je veux pouvoir remplacer certains appels de fonction par des faux. Voici un extrait de mon 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])
}
}
J'aimerais pouvoir tester downloader () sans réellement obtenir une page via http - c'est-à-dire en se moquant soit de get_page (plus facile car il ne renvoie que le contenu de la page sous forme de chaîne) soit de http.Get ().
J'ai trouvé ce fil: https://groups.google.com/forum/#!topic/golang-nuts/6AN1E2CJOxI qui semble concerner un problème similaire. Julian Phillips présente sa bibliothèque, Withmock ( http://github.com/qur/withmock ) comme une solution, mais je ne parviens pas à la faire fonctionner. Voici les parties pertinentes de mon code de test, qui est en grande partie un code culte pour moi, pour être honnête:
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
}
La sortie de test est la suivante:
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
Le Withmock est-il une solution à mon problème de test? Que dois-je faire pour le faire fonctionner?