unit-testing - Google App Engine 数据存储 - 测试查询失败

标签 unit-testing google-app-engine go google-cloud-datastore

我目前正在尝试测试我的一段代码,该代码在放入新实体之前在数据存储上运行查询以确保不会创建重复项。我编写的代码在应用程序的上下文中运行良好,但我为该方法编写的测试失败了。似乎我无法通过测试包上下文中的查询访问放入数据存储区的数据。

一种可能性可能在于 goapp test 的输出,其中显示:Applying all pending transactions and saving the datastore。这行在调用 get 和 put 方法后打印出来(我用日志语句验证了这一点)。

我尝试关闭上下文并为不同的操作创建一个新上下文,但不幸的是,这也无济于事。下面是一个简单的测试用例,它放入一个对象然后对其运行查询。任何帮助将不胜感激。

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) == 0 {
        t.Error("No keys found in query")
    }
    if len(entities) == 0 {
        t.Error("No entities found in query")
    }
}

最佳答案

你的测试代码没有问题。问题在于数据存储本身。 HR 数据存储中的大多数查询不是“立即一致”的,而是 eventually consistent .您可以在 Datastore 中阅读更多相关信息文档。

所以基本上发生的事情是您将一个实体放入数据存储区,并且 SDK 的数据存储区“模拟”您可以在生产中观察到的延迟,因此如果您在此之后立即运行查询(这不是祖先查询) , 查询结果将不包括您刚刚保存的新实体。

如果您在 datastore.Put()q.GetAll() 之间暂停几秒钟,您将看到测试通过。试试看。在我的测试中,只睡 100 毫秒就足够了,而且测试总是通过。但是在为这种情况编写测试时,请使用 StronglyConsistentDatastore: true 选项,如 JonhGB 的答案所示。

如果您使用 Ancestor queries,您也会看到测试通过而无需 sleep 因为它们是 strongly consistent .

关于unit-testing - Google App Engine 数据存储 - 测试查询失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28590519/

相关文章:

java - 当父级在不同的包中时模拟 protected 父级方法

node.js - 无法在 GAE 上部署 node.js 应用程序

arrays - 结构问题中的 Golang 数组

templates - 如何直接在模板文件中访问结构 slice 元素键

python - 什么是报告框架?

node.js - 错误: async hook stack has become corrupted in node js

unit-testing - Assert.Fail() 被认为是不好的做法吗?

java - 如何将本地 Google Cloud SQL stub 连接到 MySQL DB

python - 为什么对象的键是None?

go - 如何覆盖压缩包中的文件