React Jest, как утверждать, что функция не вызывается

В Jest есть функции, такие как toeCalled или toBeCalledWith чтобы проверить, toBeCalledWith ли конкретная функция. Есть ли способ проверить, что функция не вызывается?

Ответ 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
});

В редких случаях вы можете даже написать свой собственный прибор, который бы подсчитывал. Это может быть полезно, например, если вы много работаете с физическими состояниями или работаете с состоянием.

Надеюсь это поможет!