Karate测试中如何修改请求内Map中数组的取值?
Karate测试中更新嵌套数组字段的解决方案
问题场景
你的请求结构如下:
{ "data": [ { "startDate": "date", "endDate": "date", "displayDate": "date", "partnerId": "partner", "type": "type", "regions": ["QQ"], "promotionId": "promotion" } ] }
需要更新regions字段的值,但尝试多种方法均失败,出现JSONPath语法错误或找不到字段的情况。
你尝试过的无效方法
* set request.data.regions = newValue * set request.data[*].regions = newValue * set request[*].regions = newValue * def updateRegion = """ function(){karate.appendTo(request.data[*].regions, newValue) } """ * karate.foreach(request, updateRegion)
错误原因分析
request.data.regions:request.data是数组类型,不是对象,直接通过.访问regions会找不到字段request[*].regions:JSONPath定位错误,顶级字段是data,需先定位到request.data数组- JS函数中使用
request.data[*].regions:函数内不能直接用JSONPath的*通配符,需操作单个数组元素
正确解决方案
方案1:直接指定数组索引更新(适合单元素数组)
如果data数组只有一个元素,直接通过索引定位:
# 定义新的regions值 * def newValue = ["US", "EU"] # 更新字段 * set request.data[0].regions = newValue
方案2:遍历数组批量更新(适合多元素数组)
如果data数组有多个元素,用karate.foreach遍历每个对象并更新:
* def newValue = ["CN", "JP"] * karate.foreach(request.data, function(item) { item.regions = newValue })
方案3:使用JSONPath通配符批量更新
确认newValue是合法数组的前提下,正确使用JSONPath的*通配符:
* def newValue = ["AU", "NZ"] * set request.data[*].regions = newValue
方案4:追加元素到regions数组(而非覆盖)
如果需要追加元素而非完全覆盖,可在foreach中使用karate.appendTo:
* def newRegion = "IN" * karate.foreach(request.data, function(item) { karate.appendTo(item.regions, newRegion) })
内容的提问来源于stack exchange,提问作者CodingChecho
相关产品推荐
相关产品推荐

