Utilisez jest.spyOn()
y spy.mockRestore()
.
const spy = jest.spyOn(console, 'warn').mockImplementation();
...
spy.mockRestore();
La réponse acceptée ne rétablit pas l'original console.warn()
et "compromettra" les autres tests à l'intérieur du même fichier (si console.warn()
est utilisé à l'intérieur des autres tests ou du code testé).
Pour info, si vous utilisez console.warn = jest.fn()
dans un fichier de test, cela n'affectera pas les autres fichiers de test (par exemple console.warn reprendra sa valeur originale dans les autres fichiers de test).
Conseil : vous pouvez appeler spy.mockRestore()
à l'intérieur de afterEach()
/ afterAll()
pour être sûr que même si un test se plante, il ne compromettra pas les autres tests du même fichier (c'est-à-dire que les tests à l'intérieur d'un même fichier sont totalement isolés).
Exemple complet :
const spy = jest.spyOn(console, 'warn').mockImplementation();
console.warn('message1'); // Won't be displayed (mocked)
console.warn('message2'); // Won't be displayed (mocked)
expect(console.warn).toHaveBeenCalledTimes(2);
expect(spy).toHaveBeenCalledTimes(2); // Another syntax
expect(console.warn).toHaveBeenLastCalledWith('message2');
expect(spy).toHaveBeenLastCalledWith('message2'); // Another syntax
expect(spy.mock.calls).toEqual([['message1'], ['message2']]);
expect(console.warn.mock.calls).toEqual([['message1'], ['message2']]);
spy.mockRestore(); // IMPORTANT
//console.warn.mockRestore(); // Another syntax
console.warn('message3'); // Will be displayed (not mocked anymore)
expect(spy).toHaveBeenCalledTimes(0); // Not counting anymore
expect(spy.mock.calls).toEqual([]);
//expect(console.warn.mock.calls).toEqual([]); // Crash
Vous ne pouvez pas écrire
console.warn = jest.fn().mockImplementation();
...
console.warn.mockRestore();
parce que ça ne restaurera pas l'original console.warn()
.
/!\N- Avec mockImplementationOnce()
vous devrez toujours appeler spy.mockRestore()
:
// /!\
const spy = jest.spyOn(console, 'warn').mockImplementationOnce(() => {});
console.warn('message1'); // Won't be displayed (mocked)
expect(console.warn).toHaveBeenCalledTimes(1);
expect(spy).toHaveBeenCalledTimes(1); // Another syntax
expect(console.warn).toHaveBeenLastCalledWith('message1');
expect(spy).toHaveBeenLastCalledWith('message1'); // Another syntax
expect(spy.mock.calls).toEqual([['message1']]);
expect(console.warn.mock.calls).toEqual([['message1']]);
console.warn('message2'); // Will be displayed (not mocked anymore)
// /!\
expect(console.warn).toHaveBeenCalledTimes(2); // BAD => still counting
expect(spy.mock.calls).toEqual([['message1'], ['message2']]);
expect(console.warn.mock.calls).toEqual([['message1'], ['message2']]);
spy.mockRestore(); // IMPORTANT
//console.warn.mockRestore(); // Another syntax
console.warn('message3'); // Will be displayed (not mocked anymore)
expect(spy).toHaveBeenCalledTimes(0); // Not counting anymore
expect(spy.mock.calls).toEqual([]);
//expect(console.warn.mock.calls).toEqual([]); // Crash
Vous pouvez également écrire :
const assert = console.assert;
console.assert = jest.fn();
...
console.assert = assert;