在Jest中,有toeCalled
或toBeCalledWith
等函数来检查是否调用了特定函数。
有没有办法检查是否没有调用函数?
答案 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
});
在极少数情况下,您甚至可能要考虑编写自己的灯具来进行计数。例如,如果您精于调节条件或使用状态,它可能会很有用。
希望这会有所帮助!