Local unit testing is supported from version 1.8.6 of the Google App Engine Go SDK. The appengine/aetest
package allows me to create a Context
to unit test with.
How can I use this with net/http/httptest
to test my HTTP handlers?
See the top of goroot/src/pkg/appengine/aetest/context.go (updated source is not yet posted at https://code.google.com/p/appengine-go). At first glance, the new testing app looks to be a slightly beefier/different version of appenginetesting so you can do the same sorts of tests, see here for one way to do it with how sampleHandler(w http.ResponseWriter, r *http.Request) is called.
Alternatively, you can make your http.Handler's ContextHandler like as below:
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
}
Then you can do this in init() to support production:
http.Handle("/myNewHandler", ContextHandler{myNewHandler})
This makes testing the function easy:
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()
}
}
Here's what's from context.go inside appengine/aetest:
/* Package aetest provides an appengine.Context for use in tests.
An example test file: 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)
}
}
The environment variable APPENGINE_API_SERVER specifies the location of the api_server.py executable to use. If unset, the system PATH is consulted. */
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With