首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Grails动态查找器,其中字段名包含保留字

Grails动态查找器,其中字段名包含保留字
EN

Stack Overflow用户
提问于 2011-01-30 23:55:05
回答 1查看 1.4K关注 0票数 2

所以我有一个grails域类:

代码语言:javascript
运行
复制
class Message
{
    Inbox inbox
    Boolean hasBeenLogicallyDeletedByRecipient
    ...

    static belongsTo = [
        inbox:Inbox,
        ...
    ]

    static constraints = {
        hasBeenLogicallyDeletedByRecipient(nullable:false)
        ...
    }
}

我想使用动态查找器如下:

代码语言:javascript
运行
复制
def messages = Message.findAllByInboxAndHasBeenLogicallyDeletedByRecipient(
                    inbox, false, [order:'desc',sort:'dateCreated'])

这在STS 2.6.0.M1中运行一个针对grails1.2.1的单元测试用例很好;旋转web应用程序时,由于hasBeenLogicallyDeletedByRecipient中的By (我猜它在构建查询时混淆了动态查找器解析),它失败了。

我可以使用在应用程序中工作的标准构建器:

代码语言:javascript
运行
复制
    def messages = Message.withCriteria {
        and {
            eq('inbox', inbox)
            eq('hasBeenLogicallyDeletedByRecipient', false)
        }
        order('dateCreated', 'desc')
    }

但是,由于withCriteria没有被模拟,所以它不能立即在单元测试中工作,所以我可以在单元测试中添加以下内容:

代码语言:javascript
运行
复制
    Message.metaClass.static.withCriteria = { Closure c ->
        ...
    }

标准/单元测试模拟是最好的/接受的方法吗?我对此并不完全满意,因为它回避了标准闭包的测试。

理想情况下,我宁愿使用动态查找器--是否有一种简洁的方法使它按原样工作?如果没有办法,我想可以更改字段名(我不想这样做是有原因的,但这与问题无关).

更新:

下面是我尝试在应用程序中使用findAllByInboxAndHasBeenLogicallyDeletedByRecipient()时的堆栈跟踪--注意它是如何得到最后一个的,并将它和findAll之间的其他一切作为一个属性来处理。我在http://grails.org/OperatorNamesInDynamicMethods上读到了一些东西,但是它并没有提到任何关于垂直运动的事情。

代码语言:javascript
运行
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2011-01-31 04:39:16

测试数据库查询实际上是一种集成测试,而不是单元测试。您的测试是在/ test /unit还是/test/integration中?-我希望'withCriteria‘在集成测试中是完全功能的,而不是在单元测试中。

来自grails ( http://grails.org/doc/latest/ )的9.1节:

单元测试是“单元”级的测试。换句话说,您正在测试单个方法或代码块,而不考虑周围的基础设施。在Grails中,您需要了解单元测试和集成测试之间的区别,因为在单元测试中,Grails不向注入集成测试期间和运行时出现的任何动态方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4846451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档