当前位置: 首页 > 面试题库 >

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

萧霍英
2023-03-14
问题内容

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

一种可能性在于从输出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) == 0 {
        t.Error("No keys found in query")
    }
    if len(entities) == 0 {
        t.Error("No entities found in query")
    }
}

问题答案:

您的测试代码没有错。问题出在数据存储区本身。HR数据存储中的大多数查询不是“立即一致”的,而是最终一致的。您可以在数据存储区文档中阅读有关此内容的更多信息。

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

如果您在datastore.Put()和之间放置了几秒钟的睡眠q.GetAll(),您将看到测试通过。试试吧。在我的测试中,仅睡100毫秒就足够了,并且测试始终通过。但是在编写针对此类情况的测试时,请使用StronglyConsistentDatastore: true在JonhGB的答案中可以看到的选项。

如果您使用Ancestor查询,因为它们是高度一致的,那么您也会看到测试通过且没有睡眠。



 类似资料:
  • 我想要一个在Spring数据的帮助下创建的存储库(例如)。我不熟悉spring-data(但不熟悉spring),我使用本教程。我选择的处理数据库的技术是JPA2.1和Hibernate。问题是我不知道如何为这样的存储库编写单元测试。 让我们以方法为例。由于我正在进行测试--首先,我应该为它编写一个单元测试--这就是我遇到三个问题的地方: > 首先,如何将的模拟注入到不存在的接口实现中?Sprin

  • 问题内容: 我正在使用Go和Google Datastore在Google App Engine中构建目录应用程序。我正在使用datatore 的功能来管理不同的产品类别。这是一些数据的示例: 乐器是根实体。当我单击它时,我希望看到和,但是相反,我看到了所有到最后一个实体的后代。这不是我想要的。目前,我只对乐器的直接后代感兴趣。 像这样的一些帖子建议在数据存储区中创建一个字段来跟踪直接父母。但是,

  • 我一直在玩R中的数据库查询,这些查询是在带有PostGIS扩展的Postgres数据库上执行的。这意味着我使用了一些没有R等价物的PostGIS函数。如果不是因为这个,我可能只是在本地测试数据帧上执行相同的函数,而不是在数据库连接上执行相同的函数,但是由于PostGIS函数,这是不可能的。 是否有一种简单的方法可以在测试数据库中创建测试数据并对其运行查询并评估结果?我有一个R不直接支持的WKB列,

  • 本文向大家介绍Mybatis应用mysql存储过程查询数据实例,包括了Mybatis应用mysql存储过程查询数据实例的使用技巧和注意事项,需要的朋友参考一下 1.创建mysql存储过程,这是个复杂查询加上了判断,比较复杂 2.查看存储过程是否创建成功: 3.sqlMapper文件: 其他和直接调用sql语句一样了 以上这篇Mybatis应用mysql存储过程查询数据实例就是小编分享给大家的全部内

  • 我试图存储多个数据到我的数据透视表。我有分类用户表category_id和user_id。这是我的店铺功能。 在blade中,我有name=“categoryId[]”和name=“userId[]”。但它只存储一个类别id。我做错了什么?