В Jest есть функции, такие как toeCalled
или toBeCalledWith
чтобы проверить, toBeCalledWith
ли конкретная функция. Есть ли способ проверить, что функция не вызывается?
React Jest, как утверждать, что функция не вызывается
Ответ 1
Просто not
используйте.
expect(mockFn).not.toHaveBeenCalled()
Ответ 2
not
работал у меня, выбрасывая Invalid Chai property: toHaveBeenCalled
Но использование toHaveBeenCalledTimes
с нулем делает toHaveBeenCalledTimes
дело:
expect(mock).toHaveBeenCalledTimes(0)
Ответ 3
Пожалуйста, следуйте документации от шутки: 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);
Ответ 4
Последние версии 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
});
В редких случаях вы можете даже написать свой собственный прибор, который бы подсчитывал. Это может быть полезно, например, если вы много работаете с физическими состояниями или работаете с состоянием.
Надеюсь это поможет!