如何将响应中的两个JSON列表传递至另一个Karate feature文件
问题:Karate中如何向被调用的Feature传递两个列表参数?
我尝试将两个列表传递给read()函数调用外部Feature,但一直失败,单独传递单个列表可以正常运行。以下是具体操作:
步骤1:获取并处理数据
首先调用接口获取数据:
* url callPathProvider = anything Given url callPath When method get Then status 200
提取特定值到array1:
* def array1 = ...
将array1处理为两个列表:
* def data1 = karate.map(array1, function(x){ return { channelDefId: x } }) * print data1
打印结果:
[ {"channelDefId":"201"}, {"channelDefId":"301"}, {"channelDefId":"401"}, {"channelDefId":"501"} ... ]
* def array2 = array1.map(x => x.replace('01', '') * 1) * def data2 = karate.map(array2, function(x){ return { listOfId: x } }) * print data2
打印结果:
[ {"listOfId":2}, {"listOfId":3}, {"listOfId":4}, {"listOfId":5} ... ]
步骤2:调用外部Feature并报错
尝试传递两个列表:
* def result = call read('called.feature')(data2, data1)
执行后报错:
feature call loop failed at index: 0, js failed: 01: [ listOfId, 'channel_definitions', channelDefId, 'authorize_url'] org.graalvm.polyglot.PolyglotException: ReferenceError: "channelDefId" is not defined .:program(Unnamed:1)
被调用的called.feature内容:
Feature: Scenario: Given url 'part1' And path listOfId, 'part2', channelDefId, 'part3' When method POST Then status 201
单独传递data1或data2时,called.feature可以正常执行。
解决方案
问题出在参数传递方式上:Karate调用Feature时,若传递多个列表,不会自动将两个列表的元素一一对应绑定,只会把第一个列表作为循环参数,第二个列表无法被正确识别。
正确做法是将两个列表的对应元素合并成单个对象列表,确保每个对象同时包含listOfId和channelDefId,再传递这个合并后的列表:
// 合并两个列表的对应元素 * def combinedData = karate.mapWithIndex(array1, function(x, i){ return { channelDefId: x, listOfId: array2[i] } }) * print combinedData
合并后的列表结构示例:
[ {"channelDefId":"201", "listOfId":2}, {"channelDefId":"301", "listOfId":3}, {"channelDefId":"401", "listOfId":4}, {"channelDefId":"501", "listOfId":5} ... ]
最后调用Feature时传递合并后的列表:
* def result = call read('called.feature') combinedData
这样called.feature中的listOfId和channelDefId就能从每个合并后的对象中正确获取值,不会再出现未定义的错误。
内容的提问来源于stack exchange,提问作者Alicya
相关产品推荐
相关产品推荐

