2011-01-30 96 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