Estoy aprendiendo Go codificando un pequeño proyecto personal. Aunque es pequeño, decidí hacer pruebas de unidad rigurosas para aprender buenos hábitos en Go desde el principio.
Las pruebas unitarias triviales estaban bien y dandy, pero ahora estoy desconcertado con las dependencias; Quiero poder reemplazar algunas llamadas a funciones con simulacros. Aquí hay un fragmento de mi código:
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])
}
}
Me gustaría poder probar el descargador () sin obtener una página a través de http, es decir, burlándose de get_page (más fácil ya que devuelve solo el contenido de la página como una cadena) o http.Get ().
Encontré este hilo: https://groups.google.com/forum/#!topic/golang-nuts/6AN1E2CJOxI que parece estar relacionado con un problema similar. Julian Phillips presenta su biblioteca, Withmock ( http://github.com/qur/withmock ) como una solución, pero no puedo hacer que funcione. Estas son las partes relevantes de mi código de prueba, que para mí es en gran medida código de culto de carga, para ser honesto:
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 salida de prueba es la siguiente:
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 es una solución a mi problema de prueba? ¿Qué debo hacer para que funcione?