Google app engine 阿彭金没有储蓄

Google app engine 阿彭金没有储蓄,google-app-engine,go,Google App Engine,Go,由于某些原因,当运行下面的测试代码时,不会保存任何内容。我还有其他一些api方法,当它们不通过测试运行时,这只是第一次保存测试 当我通过localhost:8000检查数据库统计数据时,可以看到没有插入任何内容 更新:在复制和粘贴下面的代码并将其包装后,GET请求处理程序将使用一些硬编码数据保存到数据库中。所以这似乎是测试aetest.Context时的一个问题。我已经为NewTestHandler帮助程序代码添加了代码 方法在测试中创建上下文 func NewTestHandler(handl

由于某些原因,当运行下面的测试代码时,不会保存任何内容。我还有其他一些api方法,当它们不通过测试运行时,这只是第一次保存测试

当我通过localhost:8000检查数据库统计数据时,可以看到没有插入任何内容

更新:在复制和粘贴下面的代码并将其包装后,GET请求处理程序将使用一些硬编码数据保存到数据库中。所以这似乎是测试aetest.Context时的一个问题。我已经为NewTestHandler帮助程序代码添加了代码

方法在测试中创建上下文

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
}