嗨,我是新来的grails测试。愿意做如下的集成测试,但是问题是 executeUpdate()
似乎没有更新值
如何进行集成测试 executeUpdate('update query goes here')
??
请帮助建议我 样本代码是给出的问题演示.Thanks in advance.
def "for given merchantTier Id update merchantTier value"(){
setup:
def merchantTier = new MerchantTier(
value:1.11).save(flush: true) //it saves merchantTier
when:"when update with setProperty"
testData = editWithSetProperty(merchantTier.id) //id is passed
then:"it updates data and test is success"
merchantTier.value == 2.22
when:"executeUpdate query is used instead"
testData = editWithExecuteUpdate(merchantTier.id)// id is passed
then:"it does not update the data and test is failed"
merchantTier.value == 3.33
}
def editWithSetProperty(id) {
def merchantTier = MerchantTier.get(id.toLong())
merchantTier.setValue(2.22.toDouble())
}
def editWithExecuteUpdate(id) {
MerchantTier.executeUpdate('update MerchantTier mt set mt.value=:mrValue where mt.id=:mtId', [mrValue: 3.33.toDouble(), mtId: id.toLong()])
}
如何做集成测试 executeUpdate('update query goes here')
??
当你通过executeUpdate更新时,你需要再次从数据库中获取对象,所以尝试在editWithExecuteUpdate中返回从数据库中获取的新对象。
def editWithExecuteUpdate(id) {
MerchantTier.executeUpdate('update MerchantTier mt set mt.value=:mrValue where mt.id=:mtId', [mrValue: 3.33.toDouble(), mtId: id.toLong()])
merchantTier = MerchantTier.get(id)
}
一旦完成,那么你将在when:子句中得到包含商户层对象的testData。
于是
testData.value == 3.33
希望这有意义。谅谅
编辑 - 附加方式
def editWithExecuteUpdate(id) {
def updatedRecords = MerchantTier.executeUpdate('update MerchantTier mt set mt.value=:mrValue where mt.id=:mtId', [mrValue: 3.33.toDouble(), mtId: id.toLong()])
return updatedRecords
}
所以在then:子句中,由于executeUpdate只需要更新一条基于唯一id的记录,并且再次获取新的对象并检查持久化的值。
testData == 1
def freshMerchantTier = MerchantTier.get(merchantTier.id)
freshMerchantTier.value == 3.33
请你试一试这种方式。试试吧