邮递员 - 我想检查一个值是不是在数组中

Posted

技术标签:

【中文标题】邮递员 - 我想检查一个值是不是在数组中【英文标题】:Postman - I want to check a value to be inside an array邮递员 - 我想检查一个值是否在数组中 【发布时间】:2019-12-26 13:22:33 【问题描述】:

我正在用 javascript 编写一个邮递员测试来断言下面的场景。 我有一个 id 1111 并且响应返回一个 id 数组。我想写一个测试来匹配 1111 在数组中的一个 id 中。

我尝试使用包含功能,即

pm.test("The response contains a valid id in the response", function()  
    pm.expect(jsonData.results[0].totalId.children).to.include("1111");
);


    "totalId": "0000",
    "children": [
            "id": "888"
        ,
        
            "id": "3323"
        ,
        
            "id": "1111"
        
    ]
  

任何建议。

【问题讨论】:

那怎么了?您的断言将失败,因为有 111 而不是 1111 抱歉打错了,但重点是,1111 可以在该结构中的任何位置,而不仅仅是在 [2] 中 【参考方案1】:

您正在尝试检查数组children 中的值,因此,您不应使用.totalId.children,而必须使用jsonData.results[0].children

当您尝试检查数组对象的值时,您需要添加自定义 JavaScript 逻辑来检查 id 参数的值。

这是您可以在测试脚本中使用的函数。

function _isContains(json, keyname, value) 
return Object.keys(json).some(key => 
        return typeof json[key] === 'object' ? 
        _isContains(json[key], keyname, value) : key === keyname && json[key] === value;
    );

函数_isContains检查数组中每个对象的值和键名。

现在您可以将所需的输入传递给测试用例中的函数。

pm.test("The response contains a valid id in the response", function () 
    pm.expect(_isContains(jsonData.children, "id" ,"1111")).to.be.true;
);

这将检查带有键id和值1111的对象数组,如果可用则返回true,否则返回false。


最终测试脚本

var jsonData = pm.response.json();

pm.test("The response contains a valid id in the response", function () 
    pm.expect(_isContains(jsonData.children, "id" ,"1111")).to.be.true;
);

function _isContains(json, keyname, value) 
 return Object.keys(json).some(key => 
        return typeof json[key] === 'object' ? 
        _isContains(json[key], keyname, value) : key === keyname && json[key] === value;
    );

【讨论】:

如果totalID也是Array,如何扩展函数? 不确定你的意思@Alka 没有在请求中触及totalId。你想达到什么目标? 我的问题:这个函数在以下情况下也能工作吗 "total": "ID":"0000", "type":[ "typeID":1, "children": [ “id”:“888”,“id”:“3323”,“id”:“1111”],“typeID”:2,“children”:[“id”:“ 8882" , "id": "33232" , "id": "11112" ] ] @Alka 我认为答案不适用于您提供的 JSON,需要进行一些修改。【参考方案2】:

一个更简单的解决方案可能是:

const child = jsonData.results[0].totalId.children.find(c => c.id === "1111");
pm.expect(child).exist;

这种方法的优点是您可以轻松扩展您的测试套件以验证扩展的键/值(如@Ajeet Shah 示例中所述):

pm.expect(child.value).is.not.null;

注意:假设数组中只有一项的 id 为“1111”。实际上 find() 方法返回提供的数组中满足提供的测试功能的第一个元素的值。如果没有任何值满足测试函数,则返回 undefined。

Array.prototype.find()

【讨论】:

【参考方案3】:

正如@Justinas 提到的,您必须检查您的 id 它是“111”,并且您正在检查“1111”。此外,您必须更改 JSON 的结构,您在数组中缺少“[”。

 "totalId":"0000",
   "children": [
     
     "id": "888"
     ,
     
     "id": "3323"
     ,
     
     "id": "111"
      
     ]
  

最重要的是你的测试代码应该改成这样:

pm.test("The response contains a valid id in the response", function ()  pm.expect(jsonData.results[0].totalId.children[2]).to.eql("111"); );

【讨论】:

嗨,jsonData.results[0].totalId.children[2] - 该值可以是任何级别,而不仅仅是 [2]。 有了更新的信息,我的答案不完整。您可以按照“Div”写的内容进行操作。您可以将他的答案标记为正确答案。【参考方案4】:

如果 JSON 对象包含 null 值,_isContains 函数需要稍作修改:&& json[key] !== null


  "totalId":"0000",
  "children": [
  
    "id": "888",
    "value": null
  ,
  
    "id": "3323",
    "value": null
  ,
  
    "id": "111",
    "value": null
   
  ]

function _isContains(json, keyname, value) 
  return Object.keys(json).some(key => 
      return typeof json[key] === 'object' && json[key] !== null ? 
      _isContains(json[key], keyname, value) : key === keyname && json[key] === value;
  );

【讨论】:

以上是关于邮递员 - 我想检查一个值是不是在数组中的主要内容,如果未能解决你的问题,请参考以下文章

我想检查数组中的任何值是不是在数据库中

Swift - 检查一个值是不是在数组中

检查值是不是在数组中(C#)

检查映射数组中的项目是不是共享值

检查数组中的所有值是不是都存在于数据库列中

Rails,ActiveRecord,Squeel:检查数组中是不是存在值