我看到了针对该问题的解决方案的不同实现方式,但是似乎没有一个适合我。
说我有一个对象数组(长度为6),其中包含具有结构的唯一数据:
{
first_name,
last_name,
age,
dob,
address_1,
postal_code
}
如果该数组包含对象结构略短的另一个对象数组的 partial 元素,我将如何比较:
{
first_name,
last_name,
age
}
我了解,如果我比较单数项目,可以使用类似以下内容的
:expect(response[i]).toMatchObject(expected[i]);
但是我不确定如何比较完整数组...
我见过这样的东西:
expect(state).toEqual(
expect.arrayContaining([
expect.objectContaining({
type: 'END'
})
])
)
但是我无法使其正常工作。
答案 0 :(得分:0)
您可以使用.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