【问题标题】:How to test a grails Criteria query?如何测试 grails Criteria 查询?
【发布时间】:2011-09-08 03:25:15
【问题描述】:

第一次在这里发帖,希望与很多人相关。

我正在为一个域编写集成测试,在那个域上我有一个使用withCriteria() 方法的查询。我在网上搜索了很多内容,找到了很多关于如何模拟条件查询的详细说明,但没有一个关于如何准确测试它的说明。

我尝试使用mockDomain(domain,list) 函数模拟域,并为测试设置一个域以在setUp() 中使用,然后调用标准,但我什么也没得到。 我在这里做了类似的findBy 并得到了结果,但不完全是我正在寻找的结果。我很确定这不仅仅是我的查询,而是标准,我在一些地方读过标准在服务测试中不起作用。到目前为止,该查询在应用程序中对我有用,但我想进行一些测试,以防我的代码库发生更改。

实际上,我已经按照很多人的建议做了,并提取了查询的代码,并使其成为我域中的静态方法,这样我就可以为使用它的测试模拟它,但现在我不知道如何实际测试这部分。我是否需要运行应用程序并从这个角度进行功能测试,或者有什么方法可以在 grails 单元/集成测试中做到这一点。我将在下面发布我的查询。

static Attribute getDefinitionsUsingCriteria(List categoryNames, List types){
        def definitions = Definition.withCriteria() {
            and {
                'in'('type', types)
                if (categoryNames) {
                    categories {
                        'in'('name', categoryNames)
                    }
                }
            }
        }
        return definitions
    }

Definitions 有一个字符串属性类型,并且有一个Set 类型的属性类别,该集合中的每个元素都有一个String 名称属性。

我对 grails 还是很陌生,并且已经阅读了许多参考书,我很惊讶到目前为止我读过的所有书中都缺少这一点。我希望这只是我的一个错误,并且很容易测试。感谢您的帮助,并感谢您阅读这篇长文。

JR。

【问题讨论】:

    标签: testing grails criteria


    【解决方案1】:

    一种方法:将测试从test/unit 移动到test/integration 文件夹。标准在单元测试中不起作用(那里没有 Hibernate),但在集成中会起作用。切勿在集成测试中使用 mockDomain()

    注意:不要将方法设为静态 - 它只会使测试复杂化。

    第二种方式:在单元测试中 - 使用mockDomain()。只需依靠逻辑非常简单这一事实,并对除方法之外的所有内容进行单元测试。在setUp() 中覆盖它,例如:

    Definition.metaClass.getDefinitionsUsingCriteria = { List categoryNames, List types ->
        delegate.findAll{ (it.type in types) && 
            (it.categories.find { c -> c in categoryNames }) 
        }
    }
    

    【讨论】:

    • 我同意 - 不要对持久性进行单元测试,您只是在测试模拟框架。使用与数据库(默认内存数据库或“真实”数据库)的集成测试来测试持久性。
    • 嘿 Victor,我在 test/integration 文件夹中有它。我最初在服务文件中进行了查询,但没有从测试中获得预期的列表结果,.. 它们都以空列表的形式返回。但是,我将再试一次并消除静电。然而,我确实完成了所有测试,我想目前我会采用第二种方式。感谢您的帮助,我真的很感激。
    • 那么,查询肯定可以工作。那时您的数据库中有任何数据吗?如果您尝试调用Definition.list()grails console 中的条件代码本身会怎样?
    • 我假设我在数据库中有正确的数据。我正在使用 mockDomain() 方法来做到这一点。如,mockDomain(Definition,[new Defintion(ownerType:"type1")]) 是一个简单的,它似乎适用于 Definition.list()。对于我的测试,当我执行 Definition.list() 时,我会取回我为该方法制作的整个 mockedDomain。我也可以做 Definition.findByOwnerType() 也很好,但查询本身是唯一不起作用的。我正在尝试这个 grails 控制台,因为我输入了这个并且会回复你。谢谢您的帮助。 :)
    • 等等!原因与我的想法相反 %) 在集成测试中不需要 mockDomain(),它实际上是有害的 - mockDomain() 只替换了 GORM 在集成中已经创建的动态 GORM 方法测试环境。这就是它不起作用的原因 - 所有对象都是 save()d 到 mockDomain()List 参数,并且从未命中 HSQL 数据库。 Criteria 是唯一查询 HSQL 的方法,它是空的。简而言之,删除所有mockDomain()s。或者,更好的是,将测试转移到单元测试并在那里进行测试——这是一种更好的风格。
    【解决方案2】:

    Grails 2.0.1 现在有原生 @Mock 用于测试标准,但 groupProperty 尚未实现。

    我编写了模拟标准插件(使用 groupProperty)

    https://github.com/fabiooshiro/plastic-criteria

    它适用于 1.3.7

    【讨论】:

    • 感谢插件。这正是我一直在寻找的东西。
    【解决方案3】:

    从 grails 2.2 开始支持标准。请参阅What's new in Grails 2.2 上的“单元测试 GORM”

    【讨论】:

    • 是的..但是不支持某些投影,例如 groupProperty(正如@Sr. Oshiro 所说)
    猜你喜欢
    • 2016-06-17
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 2014-03-19
    • 1970-01-01
    相关资源
    最近更新 更多