Google app engine 阿彭金没有储蓄
由于某些原因,当运行下面的测试代码时,不会保存任何内容。我还有其他一些api方法,当它们不通过测试运行时,这只是第一次保存测试 当我通过localhost:8000检查数据库统计数据时,可以看到没有插入任何内容 更新:在复制和粘贴下面的代码并将其包装后,GET请求处理程序将使用一些硬编码数据保存到数据库中。所以这似乎是测试aetest.Context时的一个问题。我已经为NewTestHandler帮助程序代码添加了代码 方法在测试中创建上下文Google app engine 阿彭金没有储蓄,google-app-engine,go,Google App Engine,Go,由于某些原因,当运行下面的测试代码时,不会保存任何内容。我还有其他一些api方法,当它们不通过测试运行时,这只是第一次保存测试 当我通过localhost:8000检查数据库统计数据时,可以看到没有插入任何内容 更新:在复制和粘贴下面的代码并将其包装后,GET请求处理程序将使用一些硬编码数据保存到数据库中。所以这似乎是测试aetest.Context时的一个问题。我已经为NewTestHandler帮助程序代码添加了代码 方法在测试中创建上下文 func NewTestHandler(handl
func NewTestHandler(handlerFunc func(appengine.Context, http.ResponseWriter, *http.Request)) http.HandlerFunc {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
c, _ := aetest.NewContext(nil)
handlerFunc(c, w, r)
})
}
错误更新:调用.IntId时生成的密钥返回0
// happens in the .Get() error handling
--- err datastore: internal error: server returned the wrong number of entities
模型
代码
试验
至少根据log语句,使用complete键似乎可以检索联盟,但是数据库仍然是空的。测试期间记录是否未永久保存到数据库?至于关闭主体,我在某处的一个示例中看到了它,他们强调了它的重要性,但现在我看到它是一个io.ReadCloser,所以您是对的:正确。aetest是用于单元测试的,所以您每次都可以从头开始创建数据。很高兴知道。谢谢你的帮助
package app
import "time"
type League struct {
Name string `json:"name"`
Location string `json:"location"`
CreatedAt time.Time
}
func (api *LeagueApi) Create(c appengine.Context, w http.ResponseWriter, r *http.Request) {
// data
var league League
json.NewDecoder(r.Body).Decode(&league)
defer r.Body.Close()
// save to db
key := datastore.NewIncompleteKey(c, "leagues", nil)
if _, err := datastore.Put(c, key, &league); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
var leagueCheck League
if err := datastore.Get(c, key, &leagueCheck); err != nil {
log.Println("--- err", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// json response
if err := json.NewEncoder(w).Encode(league); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
func Test_LeagueReturnedOnCreate(t *testing.T) {
league := League{Name: "foobar"}
data, _ := json.Marshal(league)
reader := bytes.NewReader(data)
// setup request and writer
r, _ := http.NewRequest("POST", "/leagues", reader)
w := httptest.NewRecorder()
// make request
api := LeagueApi{}
handler := tux.NewTestHandler(api.Create)
handler.ServeHTTP(w, r)
// extract api response
var leagueCheck League
json.NewDecoder(w.Body).Decode(&leagueCheck)
if leagueCheck.Name != "foobar" {
t.Error("should return the league")
}
// ensure the league is in the db
}