2013-10-16 24 views

cevap

15

Goroot/src/pkg/appengine/aetest/context.go sayfasının başına bakın (güncel kaynak henüz https://code.google.com/p/appengine-go numaralı telefondan). İlk bakışta, yeni test uygulaması, appenginetesting'un hafif bir beefier/farklı versiyonu gibi görünüyor, böylece aynı tür testleri gerçekleştirebilirsiniz, bkz. here, bunu sampleHandler (w http.ResponseWriter, r * http. İstek) denir. Alternatif

, aşağıdaki gibi sevdiği http.Handler en ContextHandler yapabilirsiniz: Bu fonksiyon testleri yapar

http.Handle("/myNewHandler", ContextHandler{myNewHandler}) 

:

type ContextHandler struct { 
    Real func(*appengine.Context, http.ResponseWriter, *http.Request) 
} 

func (f ContextHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { 
    c := appengine.NewContext(r) 
    f.Real(c, w, r) 
} 

func myNewHandler(c appengine.Context, w http.ResponseWriter, r *http.Request) { 
// do something 
} 

Sonra init yapabilirsiniz() üretimini desteklemek için kullanımı kolay:

func TestMyNewHandler(t *testing.T) { 
    c := aetest.NewContext() 
    r, _ := http.NewRequest("GET", "/tasks/findOverdueSchedules", nil) 
    w := httptest.NewRecorder() 
    myNewHandler(c, w, r) 
    if 200 != w.Code { 
     t.Fail() 
    } 
} 

İçerisinde bulunan context.go, appengine/aetest:

/* Paket aetest, testlerde kullanılmak üzere bir appengine.Context sağlar.

bir örnek test dosyası: paket

import (
    "testing" 

    "appengine/memcache" 
    "appengine/aetest" 
) 

func TestFoo(t *testing.T) { 
    c, err := aetest.NewContext(nil) 
    if err != nil { 
     t.Fatal(err) 
    } 
    defer c.Close() 

    it := &memcache.Item{ 
     Key: "some-key", 
     Value: []byte("some-value"), 
    } 
    err = memcache.Set(c, it) 
    if err != nil { 
     t.Fatalf("Set err: %v", err) 
    } 
    it, err = memcache.Get(c, "some-key") 
    if err != nil { 
     t.Fatalf("Get err: %v; want no error", err) 
    } 
    if g, w := string(it.Value), "some-value" ; g != w { 
     t.Errorf("retrieved Item.Value = %q, want %q", g, w) 
    } 
} 

ortam değişkeni APPENGINE_API_SERVER

foo_test kullanımı yürütülebilir api_server.py konumunu belirtir. Eğer unset ise, sistem PATH'a danışılır. Eğer Martini kullanarak karşı değilseniz */

+0

Çok şık görünmüyor 'var contextCreator fonk olması (Burada (Ginkgo ile) testini ayarlayabilirsiniz nasıl Tüm test dışı kod işleyicilerinde appengine.Context = appengine.NewContext' (https://github.com/icub3d/appenginetesting/blob/master/recorder_test.go#L14). – Dan

+0

Her bir http.Handler içinde c: = appengine.NewContext (r) olması şık görünmüyor. Gönderiyi nasıl yaptığımı eklemek için güncelledim. – mzimmerman

+0

Size katılıyorum ve bu harika bir çözüm gibi görünüyor. Aslında Gorilla Toolkit'i kullanıyorum ve örneğimi hafifçe ['github.com/gorilla/context'](http://www.gorillatoolkit.org/pkg/context] kullanmak için kullanıyorum. isteğin ayarlanmasıyla ilgili şeyler. – Dan

1

, bağımlılık enjeksiyon sorunu çözmek için güzel bir yoldur. Gerçek bağlam enjekte edilecektir üretiminde

var _ = Describe("Items", func() { 

    var (
     m *martini.ClassicMartini 
    ) 

    BeforeEach(func() { 
     m = martini.Classic() 

     // injects app engine context into requests 
     m.Use(func(c martini.Context, req *http.Request) { 
      con, _ := aetest.NewContext(nil) 
      c.MapTo(con, (*appengine.Context)(nil)) 
     }) 

     m.Get("/items", func(c martini.Context){ 
      // code you want to test 
     }) 
    }) 

    It("should get items", func() { 
     recorder := httptest.NewRecorder() 
     r, _ := http.NewRequest("GET", "/items", nil) 
     m.ServeHTTP(recorder, r) // martini server used 
     Expect(recorder.Code).To(Equal(200)) 
    }) 
}) 

:

m.Use(func(c martini.Context, req *http.Request) { 
    c.MapTo(appengine.NewContext(req), (*appengine.Context)(nil)) 
})