利用空手道框架根据特定嵌套对象的存在来过滤 json 对象

问题描述 投票:0回答:1

我是一个相对新手的工程师,所以如果我误用术语或遗漏一些明显的东西,请原谅我。 针对问题-

我正在使用 Karate 框架编写 QA 自动化测试,并且尝试获取响应正文中收到的一系列 json 对象,评估每个对象是否存在特定的深层嵌套对象,然后创建一个对象变量,仅包含那些嵌套有该特定对象的对象,以便在以后的断言中使用,以验证该场景中的预定义模式。

我尝试了以下几种不同的变体,例如将!= null添加到filteredResponseObject定义中最深的对象中,但所有这些最终都会生成一个json变量对象,该对象仍然包含其中没有嵌套对象的对象它们,因此对于场景后面的断言无效

* def responseObjects = $.topLevelObjects[*]
// Other assertions

// creating a filtered Object that only contains topLevelObjects with the specificFourthLevel object present
*def filteredResponseObjects = $.responseObjects[?(@.specificSecondLevelObject[*].specificThirdLevelObject[?(@.specificFourthLevelObject)])]
And assert filteredResponseObjects.length > 0
//additional assertions

该对象已创建,但正如我所提到的,仍然具有不包含我正在查找的嵌套对象的 topLevelObjects。 我尝试了一些关于 CoPilot 和 Chat GPT 的建议,但没有成功。 我还应该补充一点,我想简单地使模式中测试的对象成为可选的,但我的技术主管不想使用该解决方案,因为该模式在许多其他功能文件中使用。任何帮助或建议将不胜感激。

automated-tests karate
1个回答
0
投票

我建议使用 JS 数组过滤器方法,而不是使用 JsonPath 方法。如果你不熟悉 JS,没关系,像

map()
filter()
这样的东西很容易上手。

这里有一个很好的解释:https://stackoverflow.com/a/76091034/143475

这是一个例子:

* def response =
"""
[
  {
    a: {
      b: {
        c: 1
      }
    }
  },
  {
    a: {
      b: {
      }
    }
  }
]
"""
* def filtered = response.filter(x => x.a && x.a.b && x.a.b.c == 1)

如果你很难理解这一点和链接的答案 - 尝试找懂 JS 的朋友来帮助。

© www.soinside.com 2019 - 2024. All rights reserved.