Як скинути фіктивні виклики функцій Jest перед кожним тестом


87

Я новачок у 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);
});

Відповіді:


141

Я знайшов один із способів впоратися з цим: очистити макетну функцію після кожного тесту:

Щоб додати до Sum.test.js:

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

Якщо ви хочете очистити всі макетні функції після кожного тесту, використовуйте clearAllMocks

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

Цікаво, чи є спосіб зробити це для всіх методів знущаного об’єкта. Коли я намагаюся, local.mockClear()це не працює.
громадянин конн.

27
Ви пробували використовувати jest.clearAllMocks()? Документи: jestjs.io/docs/en/jest-object#jestclearallmocks
Алекс Єфремов

@AlexEfremov, Щиро дякую за jest.clearAllMocks()функцію! Я використовував mockClear()для jest.mockкласів, і, мабуть, макети не були якось повністю очищені (виклики шпигунських функцій всередині макетних класів не були очищені). Це призвело до дуже дратують різницевий екземпляр об'єкта помилки: Compared values have no visual difference..
Патрік

Щоб покращити цю відповідь, я оновив своє jest.config.jsмайно resetMocks: true.
Кевін Аунг

22

Як зазначив у коментарях @AlexEfremov. Можливо, ви захочете використовувати clearAllMocksпісля кожного тесту:

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

Пам’ятайте, це дозволить очистити кількість дзвінків у кожній макетній функції, але це, мабуть, правильний шлях.


8

Ви можете налаштувати Jest на скидання макетів після кожного тесту, помістивши це у свій jest.config.js:

module.exports = {
  resetMocks: true,
};

Ось документація до цього параметра конфігурації: https://jestjs.io/docs/en/configuration#resetmocks-boolean

resetMocks [логічне значення]

За замовчуванням: false

Перед кожним тестом автоматично скидайте фіктивний стан. Еквівалентно виклику jest.resetAllMocks () перед кожним тестом. Це призведе до видалення фальшивих реалізацій, але не відновить їх початкову реалізацію.


3
Дякую! Чому це не налаштування за замовчуванням насправді бентежить ...
довільний або
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.