appengine不是在储蓄

时间:2014-09-15 00:44:25

标签: google-app-engine go

出于某种原因,运行以下测试代码时不会保存任何内容。我有其他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

模型

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
}

0 个答案:

没有答案