javascript - Hur man återställer Jest-mockfunktioners anropsräknare före varje test


Jag försöker använda det för att testa om en funktion blev kallad eller inte. Jag märkte att mock.calls.length inte återställs för varje test utan ackumuleras. Hur kan jag göra den 0 före varje test? Jag vill inte att mina nästa tester ska bero på resultaten från de tidigare.

Jag vet att det finns beforeEach i Jest - ska jag använda det? Vad är det bästa sättet att återställa mock.calls.length?

Ett kodexempel:

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);
});

Svar #1

Ett sätt jag hittade för att hantera det: att rensa mock-funktionen efter varje test:

För att lägga till i Sum.test.js:

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

Om du vill rensa alla mockfunktioner efter varje test, använd clearAllMocks

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

Svar #2

Som @AlexEfremov påpekade i kommentarerna. Du kanske vill använda clearAllMocks efter varje test:

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

Ha i åtanke att detta kommer att rensa samtalsräkningen för varje mockfunktion du har, men det är förmodligen rätt sätt.

Svar #3

Du kan konfigurera Jest för att återställa eller rensa mocks efter varje test genom att lägga en av dessa parametrar i din jest.config.js:

module.exports = {
  resetMocks: true,
};

eller

module.exports = {
  clearMocks: true,
};

Här är dokumentationen:

https://jestjs.io/docs/sv/configuration#resetmocks-boolean

resetMocks [boolean]

Standard: falsk

Återställ automatiskt mocktillståndet före varje test. Motsvarar att anropa jest.resetAllMocks() före varje test. Detta kommer att leda till att alla mocks får sina falska implementationer borttagna men återställer inte deras ursprungliga implementation.

https://jestjs.io/docs/configuration#clearmocks-boolean

clearMocks [boolean]

Standard: falsk

Rensa automatiskt mock-anrop, instanser och resultat före varje test. Motsvarar att anropa jest.clearAllMocks() före varje test. Detta tar inte bort någon mock-implementation som kan ha tillhandahållits.

Svar #4

jest.clearAllMocks() rensade faktiskt inte alla mockar för mig.

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

hjälpte mig äntligen att klara spionen på skämt

Relaterade artiklar