javascript - Hvordan tilbakestille eller tømme en spion i Jest?
Jeg har en spion som brukes i flere påstander på tvers av flere tester i en testpakke.
Hvordan tømmer eller tilbakestiller jeg spionen slik at i hver test anses metoden som spionen fanger opp for å ikke ha blitt kalt?
For eksempel, hvordan få påstanden i 'kjører ikke metoden' til å være sann?
const methods = {
run: () => {}
}
const spy = jest.spyOn(methods, 'run')
describe('spy', () => {
it('runs method', () => {
methods.run()
expect(spy).toHaveBeenCalled() //=> true
})
it('does not run method', () => {
// how to make this true?
expect(spy).not.toHaveBeenCalled() //=> false
})
})
Svar #1
Takk til @sdgluck for svaret, men jeg vil gjerne legge til dette svaret at i mitt tilfelle ønsket jeg en klar tilstand etter hver test siden jeg har flere tester med samme spion. Så i stedet for å kalle mockClear() i forrige test(er), flyttet jeg det til afterEach() (eller du kan bruke det med beforeEach) slik:
afterEach(() => {
jest.clearAllMocks();
});
Og til slutt fungerer testene mine som de skal uten at spionen blir kalt fra forrige test. Du kan også lese dokumentasjonen deres om denne funksjonen.
Alternativ 2
Hvis du ønsker å gjøre det på et globalt nivå, kan du også oppdatere din jest.config.js (eller fra package.json) som vil tømme spionen på hver test uten å måtte kalle jest.clearAllMocks() i hver test.
module.exports = {
clearMocks: true,
// ...
}
Du kan lese Jest-dokumentasjonen om denne funksjonen.
Svar #2
Jest-spioner har det samme API-et som mocks. Dokumentasjonen for mocks er her og spesifiserer en metode mockClear som:
Tilbakestiller all informasjon lagret i
mockFn.mock.callsogmockFn.mock.instances-arrayene.Ofte er dette nyttig når du ønsker å rydde opp i en mocks bruksdata mellom to påstander.
(utheving min egen)
Så vi kan bruke mockClear for å «tilbakestille» en spion. Med ditt eksempel:
const methods = {
run: () => {}
}
const spy = jest.spyOn(methods, 'run')
describe('spy', () => {
it('runs method', () => {
methods.run()
expect(spy).toHaveBeenCalled() //=> true
/* clean up the spy so future assertions
are unaffected by invocations of the method
in this test */
spy.mockClear()
})
it('does not run method', () => {
expect(spy).not.toHaveBeenCalled() //=> true
})
})
Her er et eksempel i CodeSandbox.
Svar #3
Hvis du ønsker å gjenopprette den opprinnelige oppførselen til en metode du tidligere hadde lagt til en spion, kan du bruke metoden mockRestore.
Sjekk ut eksemplet nedenfor:
class MyClass {
get myBooleanMethod(): boolean {
return true;
}
}
const myObject = new MyClass();
const mockMyBooleanMethod = jest.spyOn(myObject, 'myBooleanMethod', 'get');
// mock myBooleanMethod to return false
mockMyBooleanMethod.mockReturnValue(false);
// restore myBooleanMethod to its original behavior
mockMyBooleanMethod.mockRestore();
Svar #4
Hvis vi bygger videre på @ghiscoding sitt svar, kan du spesifisere clearMocks i Jest-konfigurasjonen, som tilsvarer å kalle jest.clearAllMocks() mellom hver test:
{
...
clearMocks: true,
...
}
Se dokumentasjonen her.
