javascript - 检查一个对象数组是否包含 Jest 中另一个对象数组的元素
问题描述
我已经看到了解决这个问题的不同实现,但是,似乎没有一个对我有用。
假设我有一个对象数组(长度为 6),其中包含具有结构的唯一数据:
{
first_name,
last_name,
age,
dob,
address_1,
postal_code
}
如果此数组包含另一个对象数组的部分元素,其对象的结构略短,我将如何比较:
{
first_name,
last_name,
age
}
我知道,如果我要比较单个项目,我可以使用以下内容:
expect(response[i]).toMatchObject(expected[i]);
但是我不确定如何比较完整的数组...
我见过这样的事情:
expect(state).toEqual(
expect.arrayContaining([
expect.objectContaining({
type: 'END'
})
])
)
但我无法让它工作。
解决方案
您可以使用.toMatchObject(object)方法,如文档所述:
您还可以传递一个对象数组,在这种情况下,只有当接收到的数组中的每个对象都匹配(在上面描述的 toMatchObject 意义上)预期数组中的相应对象时,该方法才会返回 true。
您还可以使用expect.arrayContaining(array),如文档所述:
也就是说,预期数组是接收数组的子集。因此,它匹配包含不在预期数组中的元素的接收数组。
import faker from 'faker';
describe('test suites', () => {
it('should contains', () => {
const state = new Array(6).fill(null).map(() => ({
first_name: faker.name.firstName(),
last_name: faker.name.lastName(),
age: faker.random.number({ min: 0, max: 100 }),
dob: 'c',
address_1: faker.address.city(),
postal_code: faker.address.zipCode()
}));
const matchObj = new Array(state.length).fill(null).map((_, idx) => {
const item = state[idx];
const stateSlice = {
first_name: item.first_name,
last_name: item.last_name,
age: item.age
};
return stateSlice;
});
expect(matchObj).toEqual(
expect.arrayContaining([
expect.objectContaining({
first_name: expect.any(String),
last_name: expect.any(String),
age: expect.any(Number)
})
])
);
expect(state).toMatchObject(matchObj);
expect(state).toEqual(
expect.arrayContaining([
expect.objectContaining({
first_name: expect.any(String),
last_name: expect.any(String),
age: expect.any(Number)
})
])
);
});
});
单元测试结果:
PASS src/stackoverflow/58238433/index.spec.ts (9.564s)
test suites
✓ should contains (8ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 10.779s