2013-02-06 103 views
0

我们从Grails 1.3.7迁移到2.2的原因之一是能够对我们的(许多)标准进行单元测试。Grails 2.2中的测试标准

而且我们已经与标准进行测试碰到的第一件事情是这样的:

属性[nightly.id]不是类 的[com.litle.bldvwr.Result]在grails.gorm有效的属性。 CriteriaBuilder.validatePropertyName(CriteriaBuilder.java:968)

我们拥有的是一个简单的多对一的关系,结果和夜间。 每个结果每晚1次。 Nightly和Result之间没有直接的关系。

更新

特定代码是: Nightly.groovy:

package examples 

import java.util.Date; 

class Nightly { 
    String name 
    String status 

    static constraints = { 
     status nullable:true 
     name unique: true, nullable: false, blank: false 
    } 

    static mapping = { 
    } 
    String toString() { 
     name +' ' + status 
    } 


} 

Result.groovy:

package examples 

import java.util.Date; 

class Result { 
String status 
String name 
String type 
Nightly nightly 



static mapping = { 
} 

Result() { 
} 

static def gimmeCountByNightlyAndStatusAndRerunIsNull(def nightly, def status) { 
    def count = Result.createCriteria().count { 
     and { 
      eq('nightly.id', nightly.id) 
      eq('status', status) 
      isNull('rerun') 
     } 
    } 
    return count 
} 

} 

ResultTests.groovy

package examples 

import grails.test.mixin.* 
import org.junit.* 

@TestFor(Result) 
@Mock(Nightly) 
class ResultTests { 

void testCriteriaMess() { 

      //this test will fail due to: Property [nightly.id] is not a valid property of class [examples.Result] 

      Nightly night = new Nightly(name:'nightly1', status:'Success') 
      night.save(validate:false) 


      Result res = new Result(status: 'SUCCESS', type: 'INTEGRATION') 
      res.nightly = night 
      res.save(validate:false, flush:true) 

      def count = Result.gimmeCountByNightlyAndStatusAndRerunIsNull(night, 'SUCCESS') 
      assertTrue count==0 
     } 
} 

上述代码来自于一个全新的Grails 2.2项目,由GGTS 3.1 创建。除上述代码外,项目中的其他一切都是完成锅炉板生成的。

我认为,因为它与实际的数据库相反,'nightly.id'将被转换为结果表的nightly_id列。

这是GORM如何在2.2中被嘲笑的问题,还是我们错过了某些东西?

+0

你也可以张贴每晚的源代码和结果类 –

+0

@drorb与实际类更新。 –

回答

1

你应该查询更改为

def count = Result.createCriteria().count { 
     and { 
      eq('nightly', nightly) 
      eq('status', status) 
      isNull('rerun') 
     } 
    }