SORU
3 EKİM 2013, PERŞEMBE


Golang Mock fonksiyonları

Küçük kişisel bir proje kodlama Gitmek öğreniyorum. Küçük bile olsa, buyrun devam edin iyi alışkanlıklar edinmek için sıkı bir birim testi yapmak için baştan karar verdim.

Önemsiz birim testler hepsi iyi ve güzel, ama bağımlılıkları şimdi kafam karıştı; sahte olanlar ile bazı işlev çağrıları değiştirmek mümkün olmak istiyorum. İşte benim kod parçacığını:

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])
    }
}

İndirme test etmek istiyorum() aslında bir sayfa almadan - yani alay etmek ya get_page daha kolay bir dize olarak sadece Sayfa İçeriğini döndürür beri) ya da http http.().

Bu konuyu buldum: benzer bir sorun hakkında görünüyor https://groups.google.com/forum/#!topic/golang-nuts/6AN1E2CJOxI. Julian Phillips kütüphanesini, bir çözüm olarak Withmock (http://github.com/qur/withmock) sunuyor, ama o iş için gidemiyorum. İşte büyük ölçüde bana kargo kültü kodu, dürüst olan benim test kodu, ilgili kısımları:

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
}

Test çıktısı şudur:

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

Bu Withmock test sorunuma bir Çözüm mü? Ben onu işe almak için ne yapmalıyım?

CEVAP
3 EKİM 2013, PERŞEMBE


İyi bir test uygulamak için şeref! :)

Kişisel olarak, gomock (ya da bu konuda herhangi bir alay çerçeve; Git alaycı olmadan çok kolay olduğunu sanmıyorum. Ben ya da bir geçiş bağımlılığı downloader() fonksiyonu parametre olarak, yoksa söylerdim olun downloader() yöntemi bir tür, ve daktilo tutun get_page bağımlılık:

Yöntem 1: get_page() downloader() bir parametre olarak Geçirmek

type PageGetter func(url string) string

func downloader(pageGetterFunc PageGetter) {
    // ...
    content := pageGetterFunc(BASE_URL)
    // ...
}

Ana:

func get_page(url string) string { /* ... */ }

func main() {
    downloader(get_page)
}

Test:

func mock_get_page(url string) string {
    // mock your 'get_page()' function here
}

func TestDownloader(t *testing.T) {
    downloader(mock_get_page)
}

Method2: download() bir tür Downloader bir yöntem:

Eğer istemiyorsan geçirmek için bağımlılık gibi bir parametre, sen de yap get_page() bir üye bir tür, ve yapmak download() bir yöntem türü, sonra kullanın get_page:

type PageGetter func(url string) string

type Downloader struct {
    get_page PageGetter
}

func NewDownloader(pg PageGetter) *Downloader {
    return &Downloader{get_page: pg}
}

func (d *Downloader) download() {
    //...
    content := d.get_page(BASE_URL)
    //...
}

Ana:

func get_page(url string) string { /* ... */ }

func main() {
    d := NewDownloader(get_page)
    d.download()
}

Test:

func mock_get_page(url string) string {
    // mock your 'get_page()' function here
}

func TestDownloader() {
    d := NewDownloader(mock_get_page)
    d.download()
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Justin Schenck

    Justin Schen

    24 Kasım 2006
  • NPR

    NPR

    22 NİSAN 2006
  • Shanice Caruthers

    Shanice Caru

    27 EKİM 2011