Funções simuladas no Go

Estou aprendendo Go codificando um pequeno projeto pessoal. Mesmo sendo pequeno, decidi fazer testes unitários rigorosos para aprender bons hábitos desde o começo.

Testes unitários triviais eram todos bons e elegantes, mas estou intrigado com dependências agora; Eu quero ser capaz de substituir algumas chamadas de função com as falsas. Aqui está um trecho do meu 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])
    }
}

Eu gostaria de ser capaz de testar o downloader () sem realmente obter uma página através de http - ou seja, zombando de get_page (mais fácil, uma vez que retorna apenas o conteúdo da página como uma string) ou http.Get ().

Eu encontrei este segmento:https://groups.google.com/forum/#!topic/golang-nuts/6AN1E2CJOxI o que parece ser um problema semelhante. Julian Phillips apresenta sua biblioteca, Withmock (http://github.com/qur/withmock) como uma solução, mas não consigo fazê-lo funcionar. Aqui estão as partes relevantes do meu código de teste, que é em grande parte código de cult para mim, 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
}

A saída do teste é a seguinte:

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

O Withmock é uma solução para o meu problema de teste? O que devo fazer para que funcione?

questionAnswers(4)

yourAnswerToTheQuestion