【问题标题】: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] 中

标签: javascript postman assertion


【解决方案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;
      });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-02
      • 2017-02-14
      • 2023-01-23
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      • 2011-04-29
      • 2021-05-28
      相关资源
      最近更新 更多