web-dev-qa-db-fra.com

Comment réinitialiser ou effacer un espion dans Jest?

J'ai un espion utilisé dans plusieurs assertions lors de plusieurs tests dans une suite.

Comment effacer ou réinitialiser l'espion de sorte que, dans chaque test, la méthode qu'il intercepte soit considérée comme n'ayant pas été invoquée?

Par exemple, comment faire l’affirmation dans 'does not run method' Sois sincère?

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
  })
})
17
sdgluck

Les espions Jest ont la même API que les moqueurs. La documentation de mocks est ici et spécifie une méthode mockClear qui:

Réinitialise toutes les informations stockées dans le mockFn.mock.calls et mockFn.mock.instances tableaux.

Cela est souvent utile lorsque vous voulez nettoyer les données d'utilisation d'une maquette entre deux assertions .

(c'est moi qui souligne)

Nous pouvons donc utiliser mockClear pour "réinitialiser" un espion. En utilisant votre exemple:

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
  })
})
19
sdgluck

Merci à @sdgluck pour la réponse, bien que je veuille ajouter à cette réponse que dans mon cas, je voulais un état clair après chaque test car j'ai plusieurs tests avec le même espion. Ainsi, au lieu d'appeler la mockClear() dans les tests précédents, je l'ai déplacée dans la afterEach() comme ceci:

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

Enfin, mes tests fonctionnent comme ils le devraient sans que l’espion ne soit appelé par un test précédent.

11
ghiscoding

En répétant la réponse de @ ghiscoding, vous pouvez spécifier clearMocks dans la configuration Jest, ce qui revient à appeler jest.clearAllMocks() entre chaque test:

{
...
    clearMocks: true,
...
}

Voir la documentation ici .

1
James Irwin