所以我有一个grails域类:
class Message
{
Inbox inbox
Boolean hasBeenLogicallyDeletedByRecipient
...
static belongsTo = [
inbox:Inbox,
...
]
static constraints = {
hasBeenLogicallyDeletedByRecipient(nullable:false)
...
}
}
我想使用动态查找器如下:
def messages = Message.findAllByInboxAndHasBeenLogicallyDeletedByRecipient(
inbox, false, [order:'desc',sort:'dateCreated'])
这在STS 2.6.0.M1中运行一个针对grails1.2.1的单元测试用例很好;旋转web应用程序时,由于hasBeenLogicallyDeletedByRecipient中的By (我猜它在构建查询时混淆了动态查找器解析),它失败了。
我可以使用在应用程序中工作的标准构建器:
def messages = Message.withCriteria {
and {
eq('inbox', inbox)
eq('hasBeenLogicallyDeletedByRecipient', false)
}
order('dateCreated', 'desc')
}
但是,由于withCriteria
没有被模拟,所以它不能立即在单元测试中工作,所以我可以在单元测试中添加以下内容:
Message.metaClass.static.withCriteria = { Closure c ->
...
}
标准/单元测试模拟是最好的/接受的方法吗?我对此并不完全满意,因为它回避了标准闭包的测试。
理想情况下,我宁愿使用动态查找器--是否有一种简洁的方法使它按原样工作?如果没有办法,我想可以更改字段名(我不想这样做是有原因的,但这与问题无关).
更新:
下面是我尝试在应用程序中使用findAllByInboxAndHasBeenLogicallyDeletedByRecipient()
时的堆栈跟踪--注意它是如何得到最后一个的,并将它和findAll之间的其他一切作为一个属性来处理。我在http://grails.org/OperatorNamesInDynamicMethods上读到了一些东西,但是它并没有提到任何关于垂直运动的事情。
org.codehaus.groovy.grails.exceptions.InvalidPropertyException: No property found for name [byInboxAndHasBeenLogicallyDeleted] for class [class xxx.Message]
at xxx.messages.yyyController$_closure3.doCall(xxx.messages.yyyController:53)
at xxx.messages.yyyController$_closure3.doCall(xxx.messages.yyyController)
at java.lang.Thread.run(Thread.java:662)
发布于 2011-01-31 04:39:16
测试数据库查询实际上是一种集成测试,而不是单元测试。您的测试是在/ test /unit还是/test/integration中?-我希望'withCriteria‘在集成测试中是完全功能的,而不是在单元测试中。
来自grails ( http://grails.org/doc/latest/ )的9.1节:
单元测试是“单元”级的测试。换句话说,您正在测试单个方法或代码块,而不考虑周围的基础设施。在Grails中,您需要了解单元测试和集成测试之间的区别,因为在单元测试中,Grails不向注入集成测试期间和运行时出现的任何动态方法。
https://stackoverflow.com/questions/4846451
复制相似问题