所以我有一個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)
這是一個單元測試(/測試/單元)。如果我拼錯Message.findAllByInboxAndHasBeenLogicallyDeletedByRecipient(...),但如果我使用條件和拼寫錯誤eq('hasBeenLogicallyDeletedByRecipient',false),則無法對動態查找程序進行單元測試。雖然我想它會在整合測試。 – rhu 2011-01-31 09:08:35