JEST - 检查对象数组是否为另一个数组的子集

3
使用JEST我想测试一个对象数组是否为另一个数组的子集。
我想要测试以下内容:
const users = [{id: 1, name: 'Hugo'}, {id: 2, name: 'Francesco'}, {id: 3, name: 'Carlo'}];
const subset = [{id: 1, name: 'Hugo'}, {id: 2, name: 'Francesco'}];

expect(users).toContain(subset)

我尝试了以下方法:

describe('test 1', () => {
  it('test 1', () => {
    expect(users).toEqual(
      expect.arrayContaining([
        expect.objectContaining(subset)
      ])
    )
  });
});

但这是不正确的,因为objectContaining不接受数组作为参数……它只在子集是单个对象时起作用。
2个回答

3

我个人没有尝试过,但是只说这样不会有效吗:

expect(users).toEqual(
  expect.arrayContaining(subset)
)

1
你差点就成功了...但是这一行代码给你带来了麻烦:expect.objectContaining(subset),你应该传递一个对象而不是一个数组。
正如@instanceof所提到的,下面的代码可以工作...但是让我分享一下具体情况。
expect(users).toEqual(
    expect.arrayContaining(subset)
)

在上面的代码片段中,expect.arrayContaining(subset)匹配包含所有预期数组元素的接收到的数组。也就是说,预期数组是接收到的数组的子集。
请注意,即使您只检查单个元素,也需要将其作为数组传递给arrayContaining()方法。
对于objectContaining()也是一样的。比如说,如果您想检查一个数组是否包含一个对象,可以像这样测试。
expect(users).toEqual(
    expect.arrayContaining([ // Note that it should be an array
        expect.objectContaining({ // Note that it should be an object
            id: 123,
        });
    ]);
);

希望这能帮到你 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接