Cucumber 如何使用karatejs进行精确的复杂jsonapi响应匹配

Cucumber 如何使用karatejs进行精确的复杂jsonapi响应匹配,cucumber,karate,Cucumber,Karate,假设这是我的API响应: { "name": "hello-world", "listObjects": [ { "id": 100, }, { "id": 200, } ] } 我想用这个回答来验证这一点: { "name": "hello-world", "listObjects": [ { "id": 100, }, { "id": 200, } ] }

假设这是我的API响应:

{
  "name": "hello-world",
  "listObjects": [
    {
      "id": 100,
    },
    {
      "id": 200,
    }
  ]
}
我想用这个回答来验证这一点:

{
  "name": "hello-world",
  "listObjects": [
    {
      "id": 100,
    },
    {
      "id": 200,
    }
  ]
}
为此,我正在做:
response==myJson
。这很好用

但是
listObjects
可以是任何顺序。这种反应有时可能是这样的:

  "name": "hello-world",
  "listObjects": [
    {
      "id": 200,
    },
    {
      "id": 100,
    }
  ]
}
在这种情况下,如何在一行中进行精确的json匹配? 我不想进行单独的密钥匹配。
它应该在一行中完成。

您至少需要两行。阅读文档以了解更多信息:

* def list = [{ id: 200 }, { id: 100 }]
* def response =
"""
{
  "name": "hello-world",
  "listObjects": [
    {
      "id": 100,
    },
    {
      "id": 200,
    }
  ]
}
"""
* match response.listObjects contains only list
* match response == { name: 'hello-world', listObjects: '#(^^list)' }

你至少需要两行。阅读文档以了解更多信息:

* def list = [{ id: 200 }, { id: 100 }]
* def response =
"""
{
  "name": "hello-world",
  "listObjects": [
    {
      "id": 100,
    },
    {
      "id": 200,
    }
  ]
}
"""
* match response.listObjects contains only list
* match response == { name: 'hello-world', listObjects: '#(^^list)' }

在本例中,首先可以使用“id”显式地对来自API的响应进行排序。有几个库将使用一个特定的键对数组进行排序。使用这些函数,您可以首先按照预期JSON的外观对实际API响应进行排序,然后使用equals比较它们。在这种情况下,首先您可以使用“id”显式地对来自API的响应进行排序。有几个库将使用一个特定的键对数组进行排序。使用这些,您可以按照预期的JSON外观对实际API响应进行排序,并使用equals比较它们

谢谢Peter!但这不是一个通用的解决方案。如果我这样做,我将用有效负载绑定我的测试用例。假设将来响应负载发生变化,那么我也必须改变代码。我希望做的是:
*匹配响应==WhatEverJsonFileIProvide
。因此,在有效负载发生变化的情况下,我只需要对json文件进行更改,而不是对实际的测试用例进行更改。我希望这是有意义的。@s3e3您为什么不花点时间阅读文档:这样您就可以执行
*match response=read('some.json')
-并在文档中查找“嵌入表达式”。如果你觉得这太复杂了,最好是找到一个框架来实现你所期望的魔力:)是的,这就是我说的
whateverjsonfileisprovide
的意思。看来你帮不了我。你甚至似乎都不理解这个问题。我正在做这个
*match response=read('some.json')
,但是响应中的列表对象可以是任意顺序的,所以有时会失败。请不要再次指向文档。这不是我想要的。@s3e3,我想说的是,你想要一行复杂的断言,这在空手道中是不可能的。我要求你们找到任何一个框架,在其中这是可能的。和平。是的,你期待的是魔法。谢谢彼得!但这不是一个通用的解决方案。如果我这样做,我将用有效负载绑定我的测试用例。假设将来响应负载发生变化,那么我也必须改变代码。我希望做的是:
*匹配响应==WhatEverJsonFileIProvide
。因此,在有效负载发生变化的情况下,我只需要对json文件进行更改,而不是对实际的测试用例进行更改。我希望这是有意义的。@s3e3您为什么不花点时间阅读文档:这样您就可以执行
*match response=read('some.json')
-并在文档中查找“嵌入表达式”。如果你觉得这太复杂了,最好是找到一个框架来实现你所期望的魔力:)是的,这就是我说的
whateverjsonfileisprovide
的意思。看来你帮不了我。你甚至似乎都不理解这个问题。我正在做这个
*match response=read('some.json')
,但是响应中的列表对象可以是任意顺序的,所以有时会失败。请不要再次指向文档。这不是我想要的。@s3e3,我想说的是,你想要一行复杂的断言,这在空手道中是不可能的。我要求你们找到任何一个框架,在其中这是可能的。和平。是的,你期待的是魔法。