使用jest.spyOn()
和spy.mockRestore()
。
const spy = jest.spyOn(console, 'warn').mockImplementation();
...
spy.mockRestore();
接受的答案不会还原原始答案,console.warn()
并且会“破坏”同一文件中的其他测试(如果console.warn()
在其他测试或正在测试的代码中使用)。
仅供参考,如果您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;