邮递员 - 我想检查一个值是不是在数组中
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;
);
【讨论】:
以上是关于邮递员 - 我想检查一个值是不是在数组中的主要内容,如果未能解决你的问题,请参考以下文章