比较 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 可以简化这个:

https://twitter.com/KarateDSL/status/1287658286657855490