Je suis en train d'apprendre Passer par le codage d'un petit projet personnel. Même si elle est petite, j'ai décidé de faire rigoureux de tests unitaires pour apprendre de bonnes habitudes en Aller dès le début.
Trivial tests unitaires ont été tous très bien et dandy, mais je suis perplexe avec dépendances maintenant; je veux être en mesure de remplacer certains appels de fonction à la maquette. 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 à - dire en se moquant soit get_page (plus facile car elle renvoie simplement le contenu de la page comme une chaîne de caractères) ou http.Get().
J'ai trouvé ce fil: https://groups.google.com/forum/#!topic/golang-noix/6AN1E2CJOxI qui semble être sur un problème similaire. Julian Phillips présente sa bibliothèque, Withmock (http://github.com/qur/withmock) comme une solution, mais je ne suis pas en mesure de l'obtenir pour fonctionner. Voici les parties pertinentes de mon code de test, qui est en grande partie de culte du cargo code 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 du 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
Est le Withmock une solution à mon test de problème? Que dois-je faire pour le faire fonctionner?