开玩笑,如何使用“toHaveBeenCalledWith”并仅匹配数组参数中对象的一部分?

Dav*_*ave 32 mocking jestjs ts-jest

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

expect(myMockFn).toHaveBeenCalledWith(arrayArgument);
Run Code Online (Sandbox Code Playgroud)

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

expect(myMockFn).toHaveBeenCalledWith( [{x: 2, y: 3}] );
Run Code Online (Sandbox Code Playgroud)

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

[{x: 2, y: 3, id: 'some-guid'}]
Run Code Online (Sandbox Code Playgroud)

所以我的期望失败了,因为我在数组的第一个对象中没有 id 属性,但我想匹配并忽略 ID,因为它每次都会不同,即使其他参数相同。如何使用 Jest 构建这样的 Expect 调用?

man*_*shg 56

arrayContaining您可以使用和的组合objectContaining来完成这项工作。

\n

参考:

\n
    \n
  1. https://jestjs.io/docs/expect#expectarray containsarray
  2. \n
  3. https://jestjs.io/docs/expect#expectobjectcontainingobject
  4. \n
\n

这是一些示例代码:

\n
function something(a, b, somefn) {\n    somefn([{\n        x: a,\n        y: b,\n        id: \'some-guid\'\n    }]);\n}\n\ntest(\'Testing something\', () => {\n    const mockSomeFn = jest.fn();\n    something(2, 3, mockSomeFn);\n    expect(mockSomeFn).toHaveBeenCalledWith(\n        expect.arrayContaining([\n            expect.objectContaining({\n                x: 2,\n                y: 3\n            })\n        ])\n    );\n});\n
Run Code Online (Sandbox Code Playgroud)\n

示例输出:

\n
$ jest\n PASS  ./something.test.js\n  \xe2\x9c\x93 Testing something (3 ms)\n\nTest Suites: 1 passed, 1 total\nTests:       1 passed, 1 total\nSnapshots:   0 total\nTime:        0.257 s, estimated 1 s\nRan all test suites.\n\xe2\x9c\xa8  Done in 0.84s.\n
Run Code Online (Sandbox Code Playgroud)\n

这是一些解释:

\n
    \n
  1. toHaveBeenCalledWith被调用以expect.arrayContaining验证它是否是用数组调用的
  2. \n
  3. expect.arrayContaining有一个数组。该数组有一个对象,objectContaining该对象与该对象进行部分匹配。
  4. \n
\n