Testing 如何测试grails条件查询?

Testing 如何测试grails条件查询?,testing,grails,criteria,Testing,Grails,Criteria,第一篇文章在这里,希望与许多人相关 我正在为一个域编写集成测试,在该域上,我使用withCriteria()方法进行查询。我搜索了整个网络,找到了很多关于如何模拟条件查询的详细说明,但没有关于如何准确测试它的详细说明 我曾尝试使用mockDomain(domain,list)函数模拟域,并设置一个域以供测试在setUp()中使用,然后调用条件,结果一无所获。 我在这里做了一个类似的findBy,得到了结果,但并不完全是我想要的结果。我敢肯定,这不仅仅是我的查询,而是我在一些地方读到的准则,准则在

第一篇文章在这里,希望与许多人相关

我正在为一个域编写集成测试,在该域上,我使用
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
    }
定义具有字符串属性类型,并且具有类型为
Set
的属性类别,该集合中的每个元素都具有
string
name属性

我对grails还是相当陌生,已经阅读了很多参考书,我很惊讶到目前为止我读过的所有书都没有这方面的内容。我希望这只是我的一个错误,并且很容易测试。我非常感谢您的帮助,感谢您阅读这篇长文章


JR.

单向:将测试从
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 }) 
    }
}

Grails2.0.1现在有本机@Mock作为测试标准,但groupProperty尚未实现

我编写了模拟标准插件(带有groupProperty)


它在1.3.7中工作

自grails 2.2以来一直支持标准。请参阅

上的“单元测试GORM”,我同意-不要对持久性进行单元测试,您只是在测试模拟框架。使用与数据库的集成测试来测试持久性,可以是内存中的默认数据库,也可以是“真实”数据库。嘿,Victor,我在Test/integration文件夹中有它。我最初将查询保存在服务文件中,但没有从测试中获得预期的列表结果,。。他们都以空名单的形式回来了。但是,我将再次尝试并消除静电。不过,我确实完成了所有的测试,我想目前我将采用第二种方法。谢谢你的帮助,我真的很感激。那么,绝对的,查询必须工作。在那个时候,数据库中有任何数据吗?如果您尝试调用
Definition.list()
或者在
grails控制台中调用准则代码本身会怎么样?我假设数据库中的数据是正确的。我正在使用mockDomain()方法来实现这一点。与中一样,mockDomain(Definition,[newdefinition(ownerType:“type1”)])是一个简单的定义,它似乎适用于Definition.list()。在我的测试中,当我执行Definition.list()时,我会返回我为该方法创建的整个mockedDomain。我也可以做Definition.findByOwnerType()很好,但是查询本身是唯一不起作用的。我正在试用这个grails控制台,当我键入这个时,我会给你回复的。谢谢你的帮助。:)等待原因与我的想法相反。)在集成测试中,您不需要
mockDomain()
,这实际上是有害的-
mockDomain()
只会替换GORM在集成测试环境中已经创建的动态GORM方法。这就是它不起作用的原因-所有对象都被
save()
d保存到
mockDomain()
列表
参数中,并且从未命中HSQL数据库。条件是查询HSQL的唯一方法,HSQL为空。简而言之,删除所有
mockDomain()
s。或者,更好的是,将测试转移到单元测试并在那里进行测试-这是一种更好的样式。感谢插件。这正是我一直在寻找的东西。是的……但有些预测不受支持,比如groupProperty(如@Sr.Oshiro所说)