如何对Google App Engine Go HTTP处理程序进行单元测试?

Dan*_*Dan 9 google-app-engine unit-testing go

Google App Engine Go SDK的1.8.6版支持本地单元测试.该appengine/aetest软件包允许我创建一个Context单元测试.

我如何使用它net/http/httptest来测试我的HTTP处理程序?

mzi*_*man 16

请参阅goroot/src/pkg/appengine/aetest/context.go的顶部(更新的源代码尚未发布在https://code.google.com/p/appengine-go).乍一看,新的测试应用程序看起来是一个稍微更强大/不同版本的appenginetesting,所以你可以做同样的测试,请看这里有一种方法来做sampleHandler(w http.ResponseWriter,r*http.请求)被调用.

或者,您可以使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
}
Run Code Online (Sandbox Code Playgroud)

然后你可以在init()中执行此操作以支持生产:

http.Handle("/myNewHandler", ContextHandler{myNewHandler})
Run Code Online (Sandbox Code Playgroud)

这使得测试功能变得简单:

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()
    }
}
Run Code Online (Sandbox Code Playgroud)

这是来自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)
    }
}
Run Code Online (Sandbox Code Playgroud)

环境变量APPENGINE_API_SERVER指定要使用的api_server.py可执行文件的位置.如果未设置,则咨询系统PATH.*/