Використовуйте jest.spyOn()
та spy.mockRestore()
.
const spy = jest.spyOn(console, 'warn').mockImplementation();
...
spy.mockRestore();
Прийнята відповідь не відновлює оригінал console.warn()
і "скомпрометує" інші тести всередині того ж файлу (якщо console.warn()
використовується в інших тестах або коді, що тестується).
FYI, якщо ви використовуєте console.warn = jest.fn()
в тестовому файлі, це не вплине на інші тестові файли (наприклад, console.warn повернеться до початкового значення в інших тестових файлах).
Порада: ви можете зателефонувати spy.mockRestore()
всередину afterEach()
/, afterAll()
щоб бути впевненим, що навіть якщо тест аварійно завершиться, це не призведе до компрометації інших тестів із того самого файлу (наприклад, гарантує, що тести всередині того самого файлу повністю ізольовані).
Повний приклад:
const spy = jest.spyOn(console, 'warn').mockImplementation();
console.warn('message1');
console.warn('message2');
expect(console.warn).toHaveBeenCalledTimes(2);
expect(spy).toHaveBeenCalledTimes(2);
expect(console.warn).toHaveBeenLastCalledWith('message2');
expect(spy).toHaveBeenLastCalledWith('message2');
expect(spy.mock.calls).toEqual([['message1'], ['message2']]);
expect(console.warn.mock.calls).toEqual([['message1'], ['message2']]);
spy.mockRestore();
console.warn('message3');
expect(spy).toHaveBeenCalledTimes(0);
expect(spy.mock.calls).toEqual([]);
Ви не можете писати
console.warn = jest.fn().mockImplementation();
...
console.warn.mockRestore();
оскільки це не відновить оригінал console.warn()
.
/! \ З mockImplementationOnce()
вами все одно потрібно буде зателефонувати spy.mockRestore()
:
const spy = jest.spyOn(console, 'warn').mockImplementationOnce(() => {});
console.warn('message1');
expect(console.warn).toHaveBeenCalledTimes(1);
expect(spy).toHaveBeenCalledTimes(1);
expect(console.warn).toHaveBeenLastCalledWith('message1');
expect(spy).toHaveBeenLastCalledWith('message1');
expect(spy.mock.calls).toEqual([['message1']]);
expect(console.warn.mock.calls).toEqual([['message1']]);
console.warn('message2');
expect(console.warn).toHaveBeenCalledTimes(2);
expect(spy.mock.calls).toEqual([['message1'], ['message2']]);
expect(console.warn.mock.calls).toEqual([['message1'], ['message2']]);
spy.mockRestore();
console.warn('message3');
expect(spy).toHaveBeenCalledTimes(0);
expect(spy.mock.calls).toEqual([]);
Ви також можете написати:
const assert = console.assert;
console.assert = jest.fn();
...
console.assert = assert;