3 回答
TA贡献1776条经验 获得超12个赞
您的测试代码没有任何问题。问题在于数据存储本身。HR 数据存储区中的大多数查询不是“立即一致”而是最终一致。您可以在Datastore文档中阅读有关此内容的更多信息。
所以基本上发生的事情是你将一个实体放入数据存储区,SDK 的数据存储区“模拟”你可以在生产中观察到的延迟,所以如果你在这之后运行查询(这不是祖先查询),查询结果将不包括您刚刚保存的新实体。
如果在datastore.Put()
和之间放置几秒钟 sleep q.GetAll()
,您将看到测试通过。尝试一下。在我的测试中,只睡 100 毫秒就足够了,而且测试总是通过。但是在为这种情况编写测试时,请使用StronglyConsistentDatastore: true
JonhGB 的答案中所见的选项。
如果您使用Ancestor 查询,您还会看到测试通过而没有睡眠,因为它们是强一致性的。
TA贡献1880条经验 获得超4个赞
为了在最新版本的 aetest 中称赞@JohnGB 的回答,还有更多步骤可以获取具有强一致性的上下文。首先创建一个实例,然后从该实例创建一个请求,您可以使用它来生成上下文。
inst, err := aetest.NewInstance(
&aetest.Options{StronglyConsistentDatastore: true})
if err != nil {
t.Fatal(err)
}
defer inst.Close()
req, err := inst.NewRequest("GET", "/", nil)
if err != nil {
t.Fatal(err)
}
ctx := appengine.NewContext(req)
- 3 回答
- 0 关注
- 197 浏览
添加回答
举报