2011-01-30 133 views
2

所以我有一個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) 

回答

2

測試數據庫查詢實際上是一個集成測試,而不是單元測試。您的測試是在/測試/單元還是/測試/集成? - 我期望'withCriteria'在集成測試中完全可用,但不是在單元測試中。

從Grails的文檔(http://grails.org/doc/latest/),第9.1節:

單元測試是在 「單元」 級測試。換句話說,您正在測試 個別方法或代碼塊 而不考慮周圍的 基礎結構。在Grails中,你需要 是特殊性識別部和 集成測試之間的差異 因爲在單位 測試Grails的不注射任何的 期間 集成測試和運行時,目前的動態方法。

+0

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