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
})
})
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
etmockFn.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
})
})
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.
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 .