嗨,我是Grails测试的新手。愿意进行如下集成测试但是
问题是executeUpdate()
似乎没有更新值
如何进行集成测试
executeUpdate('update query goes here')
??
请帮忙建议我 示例代码用于问题演示。 提前谢谢。
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')
??
答案 0 :(得分:0)
当您通过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:clause
中包含包含merchantTier对象的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
请尝试一次这样的方式。感谢