Ответ 1
Просто not
используйте.
expect(mockFn).not.toHaveBeenCalled()
В Jest есть функции, такие как toeCalled
или toBeCalledWith
чтобы проверить, toBeCalledWith
ли конкретная функция. Есть ли способ проверить, что функция не вызывается?
Просто not
используйте.
expect(mockFn).not.toHaveBeenCalled()
not
работал у меня, выбрасывая Invalid Chai property: toHaveBeenCalled
Но использование toHaveBeenCalledTimes
с нулем делает toHaveBeenCalledTimes
дело:
expect(mock).toHaveBeenCalledTimes(0)
Пожалуйста, следуйте документации от шутки: https://jestjs.io/docs/en/mock-functions#mock-property
Все фиктивные функции имеют это специальное свойство .mock, в котором хранятся данные о том, как была вызвана функция, и о том, что возвращена функция. Свойство .mock также отслеживает значение this для каждого вызова, поэтому можно также проверить это: [...]
Эти фиктивные члены очень полезны в тестах, чтобы утверждать, как эти функции вызываются, создаются или возвращаются:
// 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);
Последние версии Jest (22.x и выше) собирают довольно приличную статистику вызовов фиктивных функций, просто посмотрите их документы.
Свойство 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');
Я лично предпочитаю этот способ, так как он дает вам большую гибкость и обеспечивает чистоту кода в случае, если вы тестируете разные входные данные, которые вызывают разное количество вызовов.
Однако с недавнего времени вы также можете использовать сокращенные псевдонимы для Jest expect
(псевдонимы шпионских советов PR). Я думаю, .toHaveBeenCalledTimes
здесь вполне подойдет:
test('drinkEach drinks each drink', () => {
const drink = jest.fn();
drinkEach(drink, ['lemon', 'octopus']);
expect(drink).toHaveBeenCalledTimes(2); // or check for 0 if needed
});
В редких случаях вы можете даже написать свой собственный прибор, который бы подсчитывал. Это может быть полезно, например, если вы много работаете с физическими состояниями или работаете с состоянием.
Надеюсь это поможет!