2012-10-11 126 views
0

我使用的是grails 2.1.0和groovy 1.8。我在服务中有以下代码:Grails 2'order'条件在单元测试中不起作用

def listServerPartners() { 
    ServerModel.withCriteria { 
     partner { 
      order('name', 'asc') 
     } 
     projections { 
      distinct('partner') 
     } 
    } 
} 

这对于运行中的应用程序和集成测试都正常工作。但是,当我尝试使用单元测试时,我得到一个空白列表。

我注意到,如果我将上面的代码更改为下面的代码并在对象伙伴中实现可比较的接口,则单元测试工作,但应用程序和集成测试不会。

def listServerPartners() { 
    ServerModel.withCriteria { 
     projections { 
      distinct('partner') 
     } 
     order('partner', 'asc') 
    } 
} 

运行应用程序时望着SQL,我注意到,第一个代码,我得到一个

"order by partner_al1_.PartnerName asc"
和第二个,我得到了
"order by partner_al1_.Partner_Id asc"
,什么是很明显,我不想要什么。

有关如何模拟我在运行单元测试的应用程序和集成测试时所具有的正确行为的任何建议?

更新时间:输出单元测试:

assert Partner.list() == results 
       |  | | 
       |  | [] 
       |  false 
       [Partner 4, Partner 3, Partner 2, Partner 1] 

- 感谢

+0

只是FYI:这[是个bug](http://jira.grails.org/browse/GRAILS-8229?page=com.atlassian.jira.plugin.system.issuetabpanels:changehistory-tabpanel),直到RC2 。所以我想知道为什么你仍然有这个问题.. –

+0

..和[我现在发现](http://jira.grails.org/browse/GRAILS-8861),也在2.0.4版本。 –

+0

问题不在于投影块。对于不使用投影的其他条件查询,我有同样的问题。我相信这个问题在订单声明中。也许模拟实现中的一个错误? – tproenca

回答

0

我更新PlasticCriteria插件。现在,它的工作原理与此:

def a = new Artist(name: 'Andreas Achenbach').save() 
def c = new Artist(name: 'Constance Gordon-Cumming').save() 
def b = new Artist(name: 'Botero').save() 
new Portrait(artist: a, name: "Clearing Up—Coast of Sicily").save() 
new Portrait(artist: c, name: "Indian Life at Mirror Lake").save() 
new Portrait(artist: c, name: "Temporary Chimneys and Fire Fountains").save() 
new Portrait(artist: b, name: "Botero's Cat").save() 
def artistList = Portrait.withCriteria{ 
    artist{ 
     order('name', 'asc') 
    } 
    projections{ 
     artist{ 
      distinct('name') 
     } 
    } 
} 
assert ['Andreas Achenbach', 'Botero', 'Constance Gordon-Cumming'] == artistList 

可以帮你 https://github.com/fabiooshiro/plastic-criteria

如果我改变预测到:

projections{ distinct('artist') } 

我得到这个集成错误: “ARTIST_ALI1_.NAME” 必须在结果列表在这种情况下

但在单元测试中工作。