Я новичок в Jest, я пытаюсь использовать его для проверки, была ли вызвана функция или нет. Я заметил, что mock.calls.length не сбрасывается для каждого теста, а накапливается. Как мне сделать 0 перед каждым тестом? Я не хочу, чтобы мои следующие тесты зависели от результатов предыдущего.

Я знаю, что в Jest есть beforeEach - стоит ли мне его использовать? Как лучше всего сбросить mock.calls.length? Спасибо.

Пример кода:

Sum.js:

import local from 'api/local';

export default {
  addNumbers(a, b) {
    if (a + b <= 10) {
      local.getData();
    }
    return a + b;
  },
};

Sum.test.js

import sum from 'api/sum';
import local from 'api/local';
jest.mock('api/local');

// For current implementation, there is a difference 
// if I put test 1 before test 2. I want it to be no difference

// test 1
test('should not to call local if sum is more than 10', () => {
  expect(sum.addNumbers(5, 10)).toBe(15);
  expect(local.getData.mock.calls.length).toBe(0);
});

// test 2
test('should call local if sum <= 10', () => {
  expect(sum.addNumbers(1, 4)).toBe(5);
  expect(local.getData.mock.calls.length).toBe(1);
});

Alex Efremov

Ответы (4)

One way I found to handle it: to clear mock function after each test:

To add to Sum.test.js:

afterEach(() => {
  local.getData.mockClear();
});

If you'd like to clear all mock functions after each test, use clearAllMocks

afterEach(() => {
  jest.clearAllMocks();
});

You can add the --resetMocks option to the command: npx jest --resetMocks

Automatically reset mock state between every test. Equivalent to calling jest.resetAllMocks()

As @AlexEfremov pointed in the comments. You may want to use clearAllMocks after each test:

afterEach(() => {
    jest.clearAllMocks();
});

Take in mind this will clear the call count of every mock function you have, but that is probably the right way.

You can configure Jest to reset mocks after each test by putting this into your jest.config.js:

module.exports = {
  resetMocks: true,
};

Here is the documentation for this configuration parameter: https://jestjs.io/docs/en/configuration#resetmocks-boolean

resetMocks [boolean]

Default: false

Automatically reset mock state before every test. Equivalent to calling jest.resetAllMocks() before each test. This will lead to any mocks having their fake implementations removed but does not restore their initial implementation.

2022 WebDevInsider