我目前正在尝试测试一段代码,该代码在放入新实体之前在数据存储区上运行查询,以确保不会创建重复项.我写的代码在应用程序的上下文中工作正常,但我为这些方法编写的测试失败了.似乎我无法通过测试包的上下文中的查询访问放入数据存储区的数据.
一种可能性在于从输出goapp test内容如下:Applying all pending transactions and saving the datastore.在调用get和put方法之后打印出这一行(我用log语句验证了这一点).
我尝试关闭上下文并为不同的操作创建一个新的上下文,但不幸的是,这也没有帮助.下面是一个简单的测试用例,它放入一个对象,然后在其上运行查询.任何帮助,将不胜感激.
type Entity struct {
Value string
}
func TestEntityQuery(t *testing.T) {
c, err := aetest.NewContext(nil)
if err != nil {
t.Fatal(err)
}
defer c.Close()
key := datastore.NewIncompleteKey(c, "Entity", nil)
key, err = datastore.Put(c, key, &Entity{Value: "test"})
if err != nil {
t.Fatal(err)
}
q := datastore.NewQuery("Entity").Filter("Value =", "test")
var entities []Entity
keys, err := q.GetAll(c, &entities)
if err != nil {
t.Fatal(err)
}
if len(keys) …Run Code Online (Sandbox Code Playgroud) 我正在尝试保存两条记录,然后获得第二条记录.问题是过滤器似乎不起作用.虽然我按名称("安德鲁W")过滤,但我总是得到"Joe Citizen".计数器还指示2个记录,它应该只是一个.这让我发疯了.请参阅下面的完整代码.结果打印出来counter 2 e2 {"Joe Citizen" "Manager" "2015-03-24 09:08:58.363929 +0000 UTC" ""}
package main
import (
"fmt"
"time"
"net/http"
"google.golang.org/appengine"
"google.golang.org/appengine/datastore"
)
type Employee struct {
Name string
Role string
HireDate time.Time
Account string
}
func init(){
http.HandleFunc("/", handle)
}
func handle(w http.ResponseWriter, r *http.Request) {
c := appengine.NewContext(r)
e1 := Employee{
Name: "Joe Citizen",
Role: "Manager",
HireDate: time.Now(),
}
_, err := datastore.Put(c, datastore.NewKey(c, "employee", "", 0, nil), &e1)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
panic(err) …Run Code Online (Sandbox Code Playgroud)