0

在这里挠头,不确定是代码还是测试。

我们需要跟踪对象的状态变化以及这些变化的历史。有时只应显示最新状态,而有时则需要整个历史列表。

最初我们认为“小菜一碟”遵循文档(grails.org/doc/2.2.x/ref/Database%20Mapping/sort.html)和这个人发现的内容(stackoverflow.com/questions/12482995/sort-a- collection-in-grails-by-date )并且是金色的。

来到单元测试时间,我们创建了测试以制作两个状态并拉出最新的。宾果游戏有效。然后,麻烦;随机间隔,测试失败。所以我们似乎找到了这个家伙发现的关于 sort 不起作用的地方。也许我错过了一些明显的东西,希望一双新的眼睛能看到它。

class mainObject {
    static hasMany = [ statusHistory : StatusHistory]

    static mapping = {
           sort id: 'asc'
           statusHistory sort:"statusDate"
    }


 String getCurrentStatus(){
     if (!this.statusHistory){
         return""
     }else{
         this.statusHistory.sort{it.sstatusDate}
         return statusHistory.status.first()
     }
 }
}


class statusHistory {

     static mapping = {
        sort statusDate: "asc"
     }

 static belongsTo = [ mainObjects : MainObject]

 Date statusDate
 String strStatus
 String notes

 String toString(){
    if (statusDate ==null){
        return "${strStatus}" + " - No Date"
    }else{
        return "${strStatus}" +" - "+ "${statusDate.getDateString()}"
    }
 }
}

单元测试

@TestMixin(GrailsUnitTestMixin)
class MainObjectTests {

    def util = new UnitTestUtil()
    def mockMainObj

    @Before
    void setUp {

          mockMainObj = util.initMockMainObj()
          mockForConstraintsTests(MainObject, [mockMainObj])
     }

    void testgetCurrentStatus(){
        assertEquals("", mockMainObj.getCurrentStatus())

        def mockObjStatus1 = util.initMockStatus(mockMainObj, new SimpleDateFormat(dd/MM/yyyy hh:mm:ss).parse("01/12/2008 15:00:00"), "First Status")
        mockDomain (StatusHistory, [mockObjStatus1])
        mockForConstaintsTests (StatusHistory, [mockObjStatus1])
        mockObjStatus1.save()
        assertEquals(1, mockMainObj.statusHistory.size())
        assertEquals("First Status", mockMainObj.getCurrentStatus())

        def mockObjStatus2 = util.initMockStatus(mockMainObj, new Date(), "Latest Status")
        mockDomain (StatusHistory, [mockObjStatus2])
        mockForConstaintsTests (StatusHistory, [mockObjStatus2])
        mockObjStatus2.save()
        assertEquals(2, mockMainObj.statusHistory.size())
        assertEquals("Latest Status", mockMainObj.getCurrentStatus())

    }
 }

根据本博客和 Beckwith 先生 (www.infoq.com/presentations/GORM-Performance )

但我不断回到文档并查看我的代码并认为它​​是正确的。所以我现在处于循环引用中。任何帮助将不胜感激。

4

1 回答 1

1

来自同事 - 可能有几种解决方案,但这将是我的方法。不要使用 hasMany 集合来获取第一个值,因为您无法确定顺序(在 Grails 中可能存在错误)。而是使用单个查询来获取值。尝试用这个替换 getCurrentStatus() 方法:

String getCurrentStatus() {
            StatusHistory.createCriteria().get() {
                            eq(‘mainObjects’, this)

                            maxResults(1)
                            order(‘statusDate, ‘asc’)

                            projections {
                                            property(‘strStatus’)
                            }
            }
}

这将只从 StatusHistory 中获取当前 MainObject 的最早 strStatus。它比检索所有历史记录然后才选择第一个历史记录更好。

这似乎解决了问题

于 2013-03-29T15:41:10.120 回答