使用 Chai 匹配对象 JSON 数组中的数组元素



假设我有一个数组

let array_of_string = ['John','Jack','Smith','Ryan'];

我如何断言这些键包含在 JSON 对象数组中,其中 JSON 是这样的

[ {
"person_name": "Jake",
"person_id": '1234',
"employee_type": "Regular"
}, {
"person_name": "Adam",
"person_id": '1245',
"employee_type": "Contractor"
}, {
"person_name": "John",
"person_id": '2342',
"employee_type": "Regular"
}, {
"person_name": "Smith",
"person_id": '3456',
"employee_type": "Contractor"
}, {
"person_name": "Ryan",
"person_id": '0123',
"employee_type": "Regular"
} ]

我正在使用Chai来断言。使用includedeep.Equal似乎不起作用。

JSON 数组是 API 的响应。所以目前我尝试了这个

it('checks if the elements are in API response', () => {
return response.then(function(resp){
expect(resp).to.be.an('array').that.includes(array_of_string )
})
})

我将名称列表中的"Jack"更改为"Jake",并从响应数据中删除了"Adam",以确保每个名称都出现在数据中,以证明下面的函数使用。

函数前面的 JS 文档描述了它的作用。

/*
* Check if each value exist (at least once) in a list (by its key).
* @param {object[]} list - List of objects.
* @param {string[]} vals - List of values to search for.
* @param {string}   key  - Key for each object to check the value.
* @return {boolean} Returns wheteher all values exist in the list.
*/
const fn = (list, vals, key) => vals.every(val => list.some(e => e[key] === val));
var names = [ 'Jake', 'John', 'Smith', 'Ryan' ];
var responseData = [{
"person_name": "Jake",
"person_id": '1234',
"employee_type": "Regular"
}, {
"person_name": "John",
"person_id": '2342',
"employee_type": "Regular"
}, {
"person_name": "Smith",
"person_id": '3456',
"employee_type": "Contractor"
}, {
"person_name": "Ryan",
"person_id": '0123',
"employee_type": "Regular"
}];
// names.every(name => responseData.some(p => p['person_name'] === name));
console.log('All names present?', fn(responseData, names, 'person_name'));
.as-console-wrapper { top: 0; max-height: 100% !important; }

好吧,这就是我会这样做的。这是显而易见的JS

'use strict';
var array_of_string = ['John', 'Jack', 'Smith', 'Ryan', 'Usman'];
var list = [{
"person_name": "Jake",
"person_id": '1234',
"employee_type": "Regular"
}, {
"person_name": "Adam",
"person_id": '1245',
"employee_type": "Contractor"
}, {
"person_name": "John",
"person_id": '2342',
"employee_type": "Regular"
}, {
"person_name": "Smith",
"person_id": '3456',
"employee_type": "Contractor"
}, {
"person_name": "Ryan",
"person_id": '0123',
"employee_type": "Regular"
}];
var b = true;
array_of_string.forEach(function (name) {
if (list.some(e=>e.person_name === name)) {} else {
b = false;
return false;
}
});
console.log(b);

如果array_of_string的所有元素都作为person_name属性存在,则应记录true否则false

您可以直接在 Chakram 响应上使用 Chai 断言。

const namesArray = [];
resp.map(person => namesArray.push(person.person_name));
names.every(name => expect(namesArray).to.include(name));
});      

最新更新