第一次发帖在这里,希望对很多人都有帮助。
我正在为一个域编写集成测试,在该域上我有一个使用 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
name 属性。
我对 grails 还是很陌生,已经阅读了很多引用书,令我惊讶的是,到目前为止我读过的所有书籍中都缺少这一点。我希望这只是我的一个错误,并且很容易测试。感谢您的帮助,感谢您阅读这篇长篇文章。
JR.
最佳答案
一种方法:将测试从 test/unit
移动到 test/integration
文件夹。 Criteria 在单元测试中不起作用(那里没有 Hibernate),但在集成中会起作用。切勿在集成测试中使用 mockDomain()
。
注意:不要将方法设为静态 - 它只会使测试复杂化。
第二种方式:在单元测试中——使用mockDomain()
。只需依靠逻辑非常简单这一事实,对除方法之外的所有内容进行单元测试。在 setUp()
中覆盖它,例如:
Definition.metaClass.getDefinitionsUsingCriteria = { List categoryNames, List types ->
delegate.findAll{ (it.type in types) &&
(it.categories.find { c -> c in categoryNames })
}
}
关于testing - 如何测试 grails Criteria 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6232923/