React Jest如何断言该函数未被调用

时间:2017-12-08 00:51:21

标签: reactjs jestjs

在Jest中,有toeCalledtoBeCalledWith等函数来检查是否调用了特定函数。 有没有办法检查是否没有调用函数?

4 个答案:

答案 0 :(得分:54)

只需使用not

expect(mockFn).not.toHaveBeenCalled()

答案 1 :(得分:1)

not对我不起作用,抛出了Invalid Chai property: toHaveBeenCalled

但是将toHaveBeenCalledTimes与零配合使用会达到目的:

expect(mock).toHaveBeenCalledTimes(0)

答案 2 :(得分:1)

请遵循jest提供的文档: https://jestjs.io/docs/en/mock-functions#mock-property

  

所有模拟函数都具有此特殊的.mock属性,该属性保存有关如何调用函数以及返回的函数的数据。 .mock属性还跟踪每个调用的此值,因此也可以检查此值:[...]

     

这些模拟成员在测试中非常有用,可以断言如何调用,实例化这些函数或将其返回:

// The function was called exactly once
expect(someMockFunction.mock.calls.length).toBe(1);

或者...

// The function was called exactly once
expect(someMockFunction.mock.calls.length).toBe(0);

答案 3 :(得分:0)

Jest的最新版本(22.x及更高版本)收集了相当不错的模拟函数调用统计信息,只需签出their docs

calls属性向您显示调用次数,传递给模拟的参数,从模拟返回的结果等等。您可以作为mock的属性直接访问它(例如,以@Christian Bonzelet在他的答案中建议的方式):

// The function was called exactly once
expect(someMockFunction.mock.calls.length).toBe(1);

// The first arg of the first call to the function was 'first arg'
expect(someMockFunction.mock.calls[0][0]).toBe('first arg');

// The second arg of the first call to the function was 'second arg'
expect(someMockFunction.mock.calls[0][1]).toBe('second arg');

我个人更喜欢这种方式,因为它可以为您提供更大的灵活性,并使代码更清晰,以防万一您测试产生不同数量调用的不同输入。

但是,自最近(spy matchers aliases PR)以来,您还可以为Jest的expect使用速记别名。我猜.toHaveBeenCalledTimes在这里很合适:

test('drinkEach drinks each drink', () => {
  const drink = jest.fn();
  drinkEach(drink, ['lemon', 'octopus']);
  expect(drink).toHaveBeenCalledTimes(2); // or check for 0 if needed
});

在极少数情况下,您甚至可能要考虑编写自己的灯具来进行计数。例如,如果您精于调节条件或使用状态,它可能会很有用。

希望这会有所帮助!