Jak zresetować Licznik wywołań funkcji Mock przed każdym testem

87

Jestem nowy w Jest, próbuję go użyć do testowania, czy funkcja została wywołana, czy nie. Zauważyłem, że mock.calls.length nie resetuje się dla każdego testu, ale się kumuluje. Jak mogę ustawić 0 przed każdym testem? Nie chcę, żeby moje następne testy zależały od wyników poprzednich.

Wiem, że jest beforeEach w Jest - czy powinienem go użyć? Jaki jest najlepszy sposób na zresetowanie mock.calls.length? Dziękuję Ci.

Przykład kodu:

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
źródło

Odpowiedzi:

141

Jeden sposób, w jaki sobie z tym poradziłem: aby wyczyścić funkcję pozorowaną po każdym teście:

Aby dodać do Sum.test.js:

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

Jeśli chcesz wyczyścić wszystkie pozorowane funkcje po każdym teście, użyj clearAllMocks

afterEach(() => {
  jest.clearAllMocks();
});
Alex Efremov
źródło
Ciekawe, czy istnieje sposób na zrobienie tego dla wszystkich metod wyszydzanego obiektu. Kiedy próbuję, local.mockClear()to nie działa.
obywatel conn
27
Czy próbowałeś użyć jest.clearAllMocks()? Dokumenty: jestjs.io/docs/en/jest-object#jestclearallmocks
Alex Efremov
@AlexEfremov, bardzo dziękuję za jest.clearAllMocks()funkcję! Używałem mockClear()do jest.mockzajęć i najwyraźniej makiety nie zostały w jakiś sposób całkowicie wyczyszczone (wywołania funkcji szpiegowskich wewnątrz pozorowanych klas nie zostały wyczyszczone). Spowodowało to naprawdę irytujące błędy różnicowych instancja obiektu: Compared values have no visual difference..
Patrick
Aby wzmocnić tę odpowiedź, zaktualizowałem swoją jest.config.jsnieruchomość resetMocks: true.
Kevin Aung
22

Jak @AlexEfremov wskazał w komentarzach. Możesz użyć clearAllMockspo każdym teście:

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

Pamiętaj, że spowoduje to wyczyszczenie liczby wywołań każdej funkcji pozorowanej, którą posiadasz, ale prawdopodobnie jest to właściwy sposób.

Daniel Marín
źródło
8

Możesz skonfigurować Jest tak, aby resetował makiety po każdym teście, umieszczając to w jest.config.js:

module.exports = {
  resetMocks: true,
};

Oto dokumentacja tego parametru konfiguracyjnego: https://jestjs.io/docs/en/configuration#resetmocks-boolean

resetMocks [boolean]

Domyślnie: false

Automatycznie resetuj stan pozorowany przed każdym testem. Równoważne wywołaniu jest.resetAllMocks () przed każdym testem. Spowoduje to usunięcie fałszywych implementacji z prób, ale nie przywróci ich początkowej implementacji.

Andrey Vetlugin
źródło
3
Dziękuję Ci! Dlaczego to nie jest ustawienie domyślne, naprawdę mnie
zdezorientowało