使用 `expect.any(Object)` 或 `expect.anything()` 无法匹配 Jest 中的 `undefined`

ala*_*yor 8 javascript unit-testing reactjs jestjs

我有以下要测试的模块。

import * as apiUtils from './apiUtils';

export function awardPoints(pointsAwarding) {
  return apiUtils.callApiService("POST", "points", pointsAwarding);
}
Run Code Online (Sandbox Code Playgroud)

这是我的测试。

it("should call apiUtils with correct path", () => {
  //given
  jest.spyOn(apiUtils, 'callApiService');

  //when
  pointsAwardingApi.awardPoints();

  //then
  expect(apiUtils.callApiService).toBeCalledWith(expect.any(String), 'points', expect.any(Object));
});
Run Code Online (Sandbox Code Playgroud)

当我尝试运行此测试时,出现以下错误。

Any<Object> as argument 3, but it was called with undefined.

我原以为这expect.any(Object)也会匹配,undefined但似乎并非如此。

我也试过,expect.anything()但我遇到了类似的错误。

我可以简单地指定undefined为第三个参数,但我的测试仅用于验证第二个参数。

有没有办法可以使用匹配任何对象的匹配器,包括undefined

que*_*zak 6

它看起来与expect.anything设计不匹配未设置的值。如果你需要一个“真正的”匹配器,这里有一个:

export const expectAnythingOrNothing = expect.toBeOneOf([expect.anything(), undefined, null]);
Run Code Online (Sandbox Code Playgroud)

你需要jest-extendedtoBeOneOf匹配-但它是一个有用的包呢:)

  • 这需要 `jest-extend` 库 (2认同)

Mic*_*ngo -3

expect.any(constructor) 匹配使用 . 创建的任何内容 constructor 。在你的例子中,它检查它是否是用Object构造函数创建的,而构造函数undefined没有创建。

expect.anything()匹配除null和之外的任何内容undefined,因为这两者在 JavaScript 中都被视为无效。expect.anything()是测试它既不是null也不是的快捷方式undefined

你试图测试的不是任何东西,而是我不在乎它是什么或者它是否存在。这样的事情没有匹配器,也不应该有,因为如果你不关心它是什么,你就不会测试它。

我可以简单地将 undefined 指定为第三个参数,但我的测试只是为了验证第二个参数。

老实说,我认为测试函数调用的特定参数并不是一个好方法。为什么您必须只测试该函数的这个参数?一般来说,如果给出了所有参数,并且如果您有可选参数,您仍然需要专门测试它们是否丢失,则函数仅提供有意义的输出。

如果参数以某种复杂的方式计算,您应该测试计算,这可能需要您从当前函数中重构它。