我有这个非常奇怪的问题。
我想将两个列表附加到一个列表中,但似乎Karate不支持此函数,所以我编写了一个JS函数。
function(lists){
var arr = []
for each (var list in lists){
for each (var item in list){
arr.push(item);
}
}
return arr;
}
我写这个功能文件进行测试:
Feature:
Scenario:
* def appendList = read('../utils/append-list.js')
* def arr = [{a: 'a'}, {b: 'b'}, {c: 'c'}]
* def arr1 = [{a: 'a'}, {b: 'b'}, {c: 'c'}]
* def arr2 = appendList([arr, arr1])
* print 'arr2', arr2
* def xx = { aa: '#(arr2)' }
* print 'xx', xx
* copy yy = xx
* print 'yy', yy
* match xx == yy
这是日志:
16:00:28.424 [main] INFO com.intuit.karate - [print] arr2 [
{
"a": "a"
},
{
"b": "b"
},
{
"c": "c"
},
{
"a": "a"
},
{
"b": "b"
},
{
"c": "c"
}
]
16:00:28.444 [main] INFO com.intuit.karate - [print] xx {
"aa": {
"0": {
"a": "a"
},
"1": {
"b": "b"
},
"2": {
"c": "c"
},
"3": {
"a": "a"
},
"4": {
"b": "b"
},
"5": {
"c": "c"
}
}
}
16:00:28.466 [main] INFO com.intuit.karate - [print] yy {
"aa": [
{
"a": "a"
},
{
"b": "b"
},
{
"c": "c"
},
{
"a": "a"
},
{
"b": "b"
},
{
"c": "c"
}
]
}
16:00:28.469 [main] ERROR com.intuit.karate - assertion failed: path: $.aa, actual: [object Array], expected: [{"a":"a"},{"b":"b"},{"c":"c"},{"a":"a"},{"b":"b"},{"c":"c"}], reason: actual value is not list-like
com.intuit.karate.exception.KarateException: path: $.aa, actual: [object Array], expected: [{"a":"a"},{"b":"b"},{"c":"c"},{"a":"a"},{"b":"b"},{"c":"c"}], reason: actual value is not list-like
at com.intuit.karate.StepDefs.matchNamed(StepDefs.java:540)
at com.intuit.karate.StepDefs.matchEquals(StepDefs.java:526)
at ✽.* match xx == yy(kromotus/test/test.feature:12)
com.intuit.karate.exception.KarateException: path: $.aa, actual: [object Array], expected: [{"a":"a"},{"b":"b"},{"c":"c"},{"a":"a"},{"b":"b"},{"c":"c"}], reason: actual value is not list-like
at com.intuit.karate.StepDefs.matchNamed(StepDefs.java:540)
at com.intuit.karate.StepDefs.matchEquals(StepDefs.java:526)
at ✽.* match xx == yy(kromotus/test/test.feature:12)
我不明白为什么有时数组是数组,有时它会变成对象?
答案 0 :(得分:2)
是的,默认情况下,JSON在内部转换为Java列表,这可能令人困惑。最佳做法是使用Java风格'尽可能。在迭代时,使用带索引的for循环。例如,试试这些:
* def first = [{a: 1}, {b: 2}]
* def second = [{c: 3}, {d: 4}]
* eval first.addAll(second)
* print first
这与上面的效果相同,但更复杂:
* def append = function(f, s){ for (var i = 0; i < s.length; i++) { f.add(s[i]) }; return f }
* def first = [{a: 1}, {b: 2}]
* def second = [{c: 3}, {d: 4}]
* def result = append(first, second)
* print result
请注意,我们使用Java List.add()
和List.addAll()
方法,而不是JS push
。你当然可以在幕后编写自定义函数。
BTW下一版空手道将引入karate.forEach
甚至map
和filter
操作,以便更轻松地进行迭代。也许我们需要karate.append()
和karate.merge()
(用于合并2个JSON对象)。随意提出功能请求。
答案 1 :(得分:1)
您可以尝试将JavaScript函数中的返回数据转换为JSON。以下是我理解的空手道中发生的事情:
* def appendList = read('../utils/append-list.js')
* def arr = [{a: 'a'}, {b: 'b'}, {c: 'c'}]
* def arr1 = [{a: 'a'}, {b: 'b'}, {c: 'c'}]
* def arr2 = appendList([arr, arr1]) # return JS[] variable type instead of JSON object
* print 'arr2', arr2
* def xx = { aa: '#(arr2)' }
* print 'xx', xx
* copy yy = xx
* print 'yy', yy
* match xx == yy
以下是如何修复它:
* def appendList = read('append-list.js')
* json arr = [{a: 'a'}, {b: 'b'}, {c: 'c'}]
* json arr1 = [{a: 'a'}, {b: 'b'}, {c: 'c'}]
* json arr2 = appendList([arr, arr1]) # convert to JSON
* print 'arr2', arr2
* json xx = { aa: '#(arr2)' }
* print 'xx', xx
* copy yy = xx
* print 'yy', yy
* match xx == yy
日志信息:
20:37:02.034 [main] WARN com.intuit.karate - skipping bootstrap configuration: could not find or read file: karate-config.js, prefix: CLASSPATH
20:37:02.139 [main] DEBUG com.jayway.jsonpath.internal.path.CompiledPath - Evaluating path: $
20:37:02.142 [main] DEBUG com.jayway.jsonpath.internal.path.CompiledPath - Evaluating path: $
20:37:02.149 [main] DEBUG com.jayway.jsonpath.internal.path.CompiledPath - Evaluating path: $
20:37:02.149 [main] DEBUG com.jayway.jsonpath.internal.path.CompiledPath - Evaluating path: $
20:37:02.168 [main] DEBUG com.jayway.jsonpath.internal.path.CompiledPath - Evaluating path: $
20:37:02.169 [main] INFO com.intuit.karate - [print] arr2 [
{
"a": "a"
},
{
"b": "b"
},
{
"c": "c"
},
{
"a": "a"
},
{
"b": "b"
},
{
"c": "c"
}
]
20:37:02.173 [main] DEBUG com.jayway.jsonpath.internal.path.CompiledPath - Evaluating path: $
20:37:02.177 [main] DEBUG com.jayway.jsonpath.internal.path.CompiledPath - Evaluating path: $
20:37:02.178 [main] DEBUG com.jayway.jsonpath.internal.path.CompiledPath - Evaluating path: $['aa']
20:37:02.179 [main] DEBUG com.jayway.jsonpath.internal.JsonContext - Set path $['aa'] new value [{a=a}, {b=b}, {c=c}, {a=a}, {b=b}, {c=c}]
20:37:02.182 [main] DEBUG com.jayway.jsonpath.internal.path.CompiledPath - Evaluating path: $
20:37:02.183 [main] INFO com.intuit.karate - [print] xx {
"aa": [
{
"a": "a"
},
{
"b": "b"
},
{
"c": "c"
},
{
"a": "a"
},
{
"b": "b"
},
{
"c": "c"
}
]
}
20:37:02.188 [main] DEBUG com.jayway.jsonpath.internal.path.CompiledPath - Evaluating path: $
20:37:02.188 [main] INFO com.intuit.karate - [print] yy {
"aa": [
{
"a": "a"
},
{
"b": "b"
},
{
"c": "c"
},
{
"a": "a"
},
{
"b": "b"
},
{
"c": "c"
}
]
}
20:37:02.189 [main] DEBUG com.jayway.jsonpath.internal.path.CompiledPath - Evaluating path: $
20:37:02.189 [main] DEBUG com.jayway.jsonpath.internal.path.CompiledPath - Evaluating path: $
1 Scenarios ([32m1 passed[0m)
10 Steps ([32m10 passed[0m)
0m0.680s
html report: (paste into browser to view)