比较 json 对象时包含抛出异常
contains throwing exception while comparing json object
我正在尝试使用包含比较 json,我在比较时遇到错误。
Feature:
Scenario:
Given def cat =
"""
{
name: 'Billie',
kittens: [
{ id: 23, name: 'Bob' },
{ id: 42, name: 'Wild' },
{ id: 43, name: 'Wild', val: 'test', charging_model : {model: "test",overage : "NAN"}}
]
}
"""
Then match cat.kittens contains [{ id: 42, name: 'Wild' }, { id: 23, name: 'Bob' }]
Then match $cat.kittens contains { id: 43, name: '#string', charging_model : {overage : "NAN"} }
异常:
com.intuit.karate.exception.KarateException: path: $.kittens[*], actual: [{"id":23,"name":"Bob"},{"id":42,"name":"Wild"},{"id":43,"name":"Wild","val":"test","charging_model":{"model":"test","overage":"NAN"}}], expected: {id=43, name=#string, charging_model={overage=NAN}}, reason: actual value does not contain expected
at com.intuit.karate.StepDefs.matchNamed(StepDefs.java:540)
at com.intuit.karate.StepDefs.matchContains(StepDefs.java:532)
at ✽.Then match $cat.kittens contains { id: 43, name: '#string', charging_model : {overage : "NAN"} }
如果我的 json 不包含 json 对象它的工作,
{
name: 'Billie',
kittens: [
{ id: 23, name: 'Bob' },
{ id: 42, name: 'Wild' },
{ id: 43, name: 'Wild', val: 'test'}
]
}
Then match $cat.kittens contains { id: 43, name: '#string' } //It is working
请帮助我如何比较 json 使用包含 json 对象的包含 json。
提前致谢。
想一想。你实际上在做 3 级 contains
第一个是数组,接下来的 2 个是 JSON 部分对象 :)
如果您进行完全匹配(完整 JSON 个对象),这将按预期工作:
Then match cat.kittens contains { id: 43, name: '#string', val: 'test', charging_model: { model: 'test', overage : 'NAN' } }
如果您不想指定所有字段,您需要做的是将 JSON 分解成这样的命名部分:
* def testModel = { overage: 'NAN' }
* def testKitten = { charging_model: '#(^testModel)' }
* match cat.kittens contains '#(^testKitten)'
这在文档中有详细解释:https://github.com/intuit/karate#contains-short-cuts
编辑:从 0.9.6 开始 contains deep
可以简化这个:
我正在尝试使用包含比较 json,我在比较时遇到错误。
Feature:
Scenario:
Given def cat =
"""
{
name: 'Billie',
kittens: [
{ id: 23, name: 'Bob' },
{ id: 42, name: 'Wild' },
{ id: 43, name: 'Wild', val: 'test', charging_model : {model: "test",overage : "NAN"}}
]
}
"""
Then match cat.kittens contains [{ id: 42, name: 'Wild' }, { id: 23, name: 'Bob' }]
Then match $cat.kittens contains { id: 43, name: '#string', charging_model : {overage : "NAN"} }
异常:
com.intuit.karate.exception.KarateException: path: $.kittens[*], actual: [{"id":23,"name":"Bob"},{"id":42,"name":"Wild"},{"id":43,"name":"Wild","val":"test","charging_model":{"model":"test","overage":"NAN"}}], expected: {id=43, name=#string, charging_model={overage=NAN}}, reason: actual value does not contain expected
at com.intuit.karate.StepDefs.matchNamed(StepDefs.java:540)
at com.intuit.karate.StepDefs.matchContains(StepDefs.java:532)
at ✽.Then match $cat.kittens contains { id: 43, name: '#string', charging_model : {overage : "NAN"} }
如果我的 json 不包含 json 对象它的工作,
{
name: 'Billie',
kittens: [
{ id: 23, name: 'Bob' },
{ id: 42, name: 'Wild' },
{ id: 43, name: 'Wild', val: 'test'}
]
}
Then match $cat.kittens contains { id: 43, name: '#string' } //It is working
请帮助我如何比较 json 使用包含 json 对象的包含 json。
提前致谢。
想一想。你实际上在做 3 级 contains
第一个是数组,接下来的 2 个是 JSON 部分对象 :)
如果您进行完全匹配(完整 JSON 个对象),这将按预期工作:
Then match cat.kittens contains { id: 43, name: '#string', val: 'test', charging_model: { model: 'test', overage : 'NAN' } }
如果您不想指定所有字段,您需要做的是将 JSON 分解成这样的命名部分:
* def testModel = { overage: 'NAN' }
* def testKitten = { charging_model: '#(^testModel)' }
* match cat.kittens contains '#(^testKitten)'
这在文档中有详细解释:https://github.com/intuit/karate#contains-short-cuts
编辑:从 0.9.6 开始 contains deep
可以简化这个: