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.calls og mockFn.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.

Relaterte artikler