ローカル ユニット テストは、Google App Engine Go SDK のバージョン 1.8.6 からサポートされています。このパッケージを使用すると、 to ユニット テストをappengine/aetest
作成できます。Context
net/http/httptest
これを使用して HTTP ハンドラーをテストするにはどうすればよいですか?
ローカル ユニット テストは、Google App Engine Go SDK のバージョン 1.8.6 からサポートされています。このパッケージを使用すると、 to ユニット テストをappengine/aetest
作成できます。Context
net/http/httptest
これを使用して HTTP ハンドラーをテストするにはどうすればよいですか?
goroot/src/pkg/appengine/aetest/context.go の上部を参照してください (更新されたソースはまだhttps://code.google.com/p/appengine-goに投稿されていません)。一見すると、新しいテスト アプリはappenginetestingの少し強化された/異なるバージョンのように見えるので、同じ種類のテストを実行できます。sampleHandler(w http.ResponseWriter, r *http. Request) が呼び出されます。
または、http.Handler の ContextHandler を以下のようにすることもできます。
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
}
次に、init() でこれを実行して、本番環境をサポートできます。
http.Handle("/myNewHandler", ContextHandler{myNewHandler})
これにより、関数のテストが簡単になります。
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()
}
}
appengine/aetest 内の context.go の内容は次のとおりです。
/* パッケージ aetest は、テストで使用する appengine.Context を提供します。
テストファイルの例: package foo_test
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)
}
}
環境変数 APPENGINE_API_SERVER は、使用する api_server.py 実行可能ファイルの場所を指定します。設定されていない場合、システム PATH が参照されます。*/
Martiniの使用に反対しない場合、依存性注入は問題を解決する良い方法です。テストをセットアップする方法は次のとおりです(Ginkgoを使用):
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))
})