如何测试grails Criteria查询?

时间:2011-06-03 21:36:36

标签: testing grails criteria

首先在这里发帖,希望与很多人有关。

我正在为域编写集成测试,在该域上我使用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。

3 个答案:

答案 0 :(得分:7)

一种方法:将测试从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 }) 
    }
}

答案 1 :(得分:3)

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

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

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

适用于1.3.7

答案 2 :(得分:0)

自Grails 2.2以来支持标准。请参阅What's new in Grails 2.2

中的“单元测试GORM”