Jest.js 开个玩笑,我如何使用“toHaveBeenCalledWith”并且只匹配数组参数中对象的一部分?

wpx232ag  于 2023-02-17  发布在  Jest
关注(0)|答案(1)|浏览(148)

我使用了Typescript和Jest。在Jest中,如果我想检查函数是否被调用,我可以运行

expect(myMockFn).toHaveBeenCalledWith(arrayArgument);

我想检查我的函数是否是用一个数组参数调用的,该参数包含一个具有某些值的对象。例如,

expect(myMockFn).toHaveBeenCalledWith( [{x: 2, y: 3}] );

实际的调用是使用如下所示的参数进行的

[{x: 2, y: 3, id: 'some-guid'}]

所以我的expect失败了,因为我在数组的第一个对象中没有id属性,但是我想匹配并忽略ID,因为它每次都不一样,即使其他参数是一样的,我怎么用Jest构造这样一个expect调用呢?

mrfwxfqh

mrfwxfqh1#

您可以使用arrayContainingobjectContaining的组合来完成此操作。
参考:

  1. www.example.com https://jestjs.io/docs/expect#expectarraycontainingarray
  2. www.example.com https://jestjs.io/docs/expect#expectobjectcontainingobject
    下面是一些示例代码:
function something(a, b, somefn) {
    somefn([{
        x: a,
        y: b,
        id: 'some-guid'
    }]);
}

test('Testing something', () => {
    const mockSomeFn = jest.fn();
    something(2, 3, mockSomeFn);
    expect(mockSomeFn).toHaveBeenCalledWith(
        expect.arrayContaining([
            expect.objectContaining({
                x: 2,
                y: 3
            })
        ])
    );
});

样本输出:

$ jest
 PASS  ./something.test.js
  ✓ Testing something (3 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.257 s, estimated 1 s
Ran all test suites.
✨  Done in 0.84s.

以下是一些解释:
1.使用expect.arrayContaining调用toHaveBeenCalledWithexpect.arrayContaining将验证是否使用数组调用toHaveBeenCalledWith

  1. expect.arrayContaining有一个数组。该数组有一个objectContaining对象,该对象与该对象进行部分匹配。

相关问题