【问题标题】:Karate - Matching Part Json with Parent空手道 - 将 Json 部分与父项匹配
【发布时间】:2018-12-25 16:28:00
【问题描述】:

以下是用于匹配的json样本;匹配包含不起作用。

* def Parent = [{ a: 1, b: 'x' }, { a: 2, b: 'y' }]
* def Part = [{ a: 1 }, { b: 'y' }]
* match Parent contains '#(^Part)'

# Below throws exception too.
* match Parent contains Part

它抛出错误,

actual: [{"a":1,"b":"x"},{"a":2,"b":"y"}], expected: '#(^Part)', reason: actual value does not contain expected

【问题讨论】:

    标签: karate


    【解决方案1】:

    这是我认为最好的解决方案。花点时间去理解它;)

    * def data = [{ a: 1 }, { b: 'y' }]
    * def response = [{ a: 1, b: 'x' }, { a: 2, b: 'y' }]
    * def expected = karate.map(data, function(x, i){ return '#(^data[' + i + '])' })
    * match response contains only expected
    

    由于我希望这个示例可以作为其他示例的参考,因此这里有一个替代解决方案,它还展示了 0.9.0 中的新 dynamic scenario outlines。请注意karate.map() 是一种循环方式,如果您查看文档和示例,还有其他方式。

    Background:
      * def data = [{ a: 1 }, { b: 'y' }]
      * def parts = karate.map(data, function(x){ return { part: x } })
      * def response = [{ a: 1, b: 'x' }, { a: 2, b: 'y' }]
    
      Scenario Outline:
        * def part = <part>
        * match response contains '#(^part)'
    
        Examples:
          | parts |
    

    【讨论】:

    • 但是,当我的第二个 json 每个子元素只有几个选定元素时,我该如何匹配/验证?像这样[{ a: 1 }, { b: 'y' }]
    • 我从来没有看到需要这个,你是想测试还是只是试验。如果你定义了 part1 和 part2,你可以这样做。让它成为你的功课。如果您无法找到解决方案,请分两步完成。万事如意
    • 考虑到某些 json 文件的长度,遍历每个子节点并进行比较可能不可行。我们可以在这里使用某种 if-else 循环吗?就像,我们首先取{a: 1},使用包含检查它是否存在于Parent中;然后转到{b: x},直到部分节点全部完成。
    • 这不是家庭作业。考虑一个场景,有两个 json 响应。我需要将下游响应与 API 响应进行比较。但是,每个下游响应仅包含每个子节点的几个元素,与我提到的问题场景非常相似。由于会有n个动态子节点,我不能每次都进行划分和检查,对吗?有什么解决办法吗?
    • 多种方式。最好是使用 json 路径,提取所需的键,然后使用匹配。或“匹配每个”可能会起作用。
    猜你喜欢
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多