如何在多维JSON数组中设置值?Karate框架语法报错求助
Karate框架中批量设置数组元素属性并匹配相等的解决方法
错误原因
Karate的karate.set不支持[*]这种通配符语法来批量修改数组内所有元素的属性,这是触发语法错误的核心原因。
解决方法
方法1:用karate.map遍历数组批量修改属性
通过karate.map遍历数组,逐个为每个元素的created_timestamp赋值#present,再重新赋值给原变量:
* def attributesFirstRun = karate.map(attributesFirstRun, (item) => { item.created_timestamp = '#present'; return item }) * def attributesSecondRun = karate.map(attributesSecondRun, (item) => { item.created_timestamp = '#present'; return item }) # 执行数组匹配 * match attributesFirstRun == attributesSecondRun
方法2:直接在匹配阶段处理(更简洁)
不需要提前修改数组,直接在match语句中用通配符指定created_timestamp为#present,同时完成匹配:
# 先验证两个数组的元素结构(包含created_timestamp且存在) * match each attributesFirstRun == { created_timestamp: '#present', ... } * match each attributesSecondRun == { created_timestamp: '#present', ... } # 再匹配两个数组完全相等 * match attributesFirstRun == attributesSecondRun
或者一步到位,直接在匹配时动态转换其中一个数组的结构:
* match attributesFirstRun == karate.map(attributesSecondRun, item => ({ created_timestamp: '#present', ...item }))
方法3:封装复用函数(适合Scenario Outline多次调用)
如果在Scenario Outline中需要多次处理这类数组,可以把逻辑封装成函数,避免重复代码:
* def markTimestampPresent = (arr) => karate.map(arr, item => { item.created_timestamp = '#present'; return item; }) # 调用函数处理数组 * def attributesFirstRun = markTimestampPresent(attributesFirstRun) * def attributesSecondRun = markTimestampPresent(attributesSecondRun) # 执行匹配 * match attributesFirstRun == attributesSecondRun
内容的提问来源于stack exchange,提问作者Gopal Subramanian
相关产品推荐
相关产品推荐

