首先在这里发帖,希望与很多人有关。
我正在为域编写集成测试,在该域上我使用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。
答案 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”