Grails的动态查找表字段名称包含保留字
所以我有一个Grails领域类: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针对Grails 1.2.1的单元测试用例; Spinning的网络应用程序,它失败了,因为由在hasBeenLogicallyDeletedByRecipient(我猜它已经混淆了动态查找解析建立查询时)。
我可以用一个标准的制造商,其在应用程序的工作原理:
def messages = Message.withCriteria {
and {
eq('inbox', inbox)
eq('hasBeenLogicallyDeletedByRecipient', false)
}
order('dateCreated', 'desc')
}
但由于withCriteria
是轻慢不得,它不会立即工作,单元测试,所以我可以添加以下的单元测试:
Message.metaClass.static.withCriteria = { Closure c ->
...
}
标准/单元测试是嘲笑最好的/被接受的方法吗?我对嘲笑这件事感到不太舒服,因为它回避了对标准关闭的测试。
理想情况下,我宁愿使用动态查找器 - 有没有一种简洁的方式来使它工作? 如果没有办法解决它,我想字段名可以改变(还有一个原因,我不想这样做,但这是无关的问题)......
UPDATE:
这里的堆栈跟踪,当我尝试使用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)
测试数据库查询实际上是一个集成测试,而不是单元测试。您的测试是在/测试/单元还是/测试/集成? - 我期望'withCriteria'在集成测试中完全可用,但不是在单元测试中。
从Grails的文档(http://grails.org/doc/latest/),第9.1节:
单元测试是在 “单元” 级测试。换句话说,您正在测试 个别方法或代码块 而不考虑周围的 基础结构。在Grails中,你需要 是特殊性识别部和 集成测试之间的差异 因为在单位 测试Grails的不注射任何的 期间 集成测试和运行时,目前的动态方法。
这是一个单元测试(/测试/单元)。如果我拼错Message.findAllByInboxAndHasBeenLogicallyDeletedByRecipient(...),但如果我使用条件和拼写错误eq('hasBeenLogicallyDeletedByRecipient',false),则无法对动态查找程序进行单元测试。虽然我想它会在整合测试。 – rhu 2011-01-31 09:08:35