Zurücksetzen der Anzahl der Jest-Mock-Funktionsaufrufe vor jedem Test

81

Ich bin neu bei Jest und versuche damit zu testen, ob eine Funktion aufgerufen wurde oder nicht. Ich habe festgestellt, dass die mock.calls.length nicht für jeden Test zurückgesetzt wird, sondern sich ansammelt. Wie kann ich es vor jedem Test auf 0 setzen? Ich möchte nicht, dass meine nächsten Tests von den Ergebnissen der vorherigen abhängen.

Ich weiß, dass es vor jedem im Scherz gibt - sollte ich es benutzen? Was ist der beste Weg, um mock.calls.length zurückzusetzen? Vielen Dank.

Ein Codebeispiel:

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
quelle

Antworten:

130

Eine Möglichkeit, damit umzugehen: die Scheinfunktion nach jedem Test zu löschen:

So fügen Sie Sum.test.js hinzu:

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

Wenn Sie nach jedem Test alle Scheinfunktionen löschen möchten , verwenden Sie clearAllMocks

afterEach(() => {
  jest.clearAllMocks();
});
Alex Efremov
quelle
Neugierig, ob es eine Möglichkeit gibt, dies für alle Methoden des verspotteten Objekts zu tun. Wenn ich es versuche local.mockClear(), funktioniert es nicht.
Bürger conn
27
Haben Sie versucht zu verwenden jest.clearAllMocks()? Docs: jestjs.io/docs/en/jest-object#jestclearallmocks
Alex Efremov
@AlexEfremov, vielen Dank für die jest.clearAllMocks()Funktion! Ich habe mockClear()für jest.mockKlassen verwendet und anscheinend wurden die Mocks irgendwie nicht vollständig gelöscht (Spionagefunktionsaufrufe innerhalb von Scheinklassen wurden nicht gelöscht). Dies führte zu wirklich ärgerlichen Unterschieden zwischen Objektinstanzunterschieden : Compared values have no visual difference..
Patrick
20

Wie @AlexEfremov in den Kommentaren zeigte. Möglicherweise möchten Sie clearAllMocksnach jedem Test Folgendes verwenden:

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

Denken Sie daran, dass dadurch die Anzahl der Anrufe für jede Mock-Funktion gelöscht wird, aber das ist wahrscheinlich der richtige Weg.

Daniel Marín
quelle
8

Sie können Jest so konfigurieren, dass Mocks nach jedem Test zurückgesetzt werden, indem Sie dies in Folgendes einfügen jest.config.js:

module.exports = {
  resetMocks: true,
};

Hier ist die Dokumentation für diesen Konfigurationsparameter: https://jestjs.io/docs/en/configuration#resetmocks-boolean

resetMocks [boolean]

Standard: false

Mock-Status vor jedem Test automatisch zurücksetzen. Entspricht dem Aufruf von jest.resetAllMocks () vor jedem Test. Dies führt dazu, dass bei Mocks die gefälschten Implementierungen entfernt werden, die ursprüngliche Implementierung jedoch nicht wiederhergestellt wird.

Andrey Vetlugin
quelle
3
Vielen Dank! Warum ist dies keine Standardeinstellung, die mich wirklich verwirrt ...
randomor