console.warn / error를 모의하려고하는데 할 수 없습니다. 내부에서 console.warn을 호출하는 타사 라이브러리를 사용합니다. 나는 그것이 호출되었는지 아닌지 테스트해야합니다. 내 테스트 케이스에서 나는 console.warn을 스텁하려고했지만 도움이되지 않았습니다. 그 후 수동으로 콘솔을 조롱하려고 시도했지만 작동하지 않았습니다.
console.warn = jest.fn();
testSchema('/app/components/Users/UserItem/UserItemContainer.js');
expect(console.warn).toBeCalled();
작동하지 않았다
console.warn = jest.fn();
testSchema('/app/components/Users/UserItem/UserItemContainer.js');
console.warn('error');
expect(console.warn).toBeCalled();
일했다. 하지만 여전히 console.warn node_modules/babel-relay-plugin/lib/getBabelRelayPlugin.js:138
터미널에서 보입니다 . 누구든지 나를 도울 수 있습니까?
답변
global
전역 컨텍스트에서 개체에 액세스 하려면을 사용해야 합니다.
global.console = {warn: jest.fn()}
expect(console.warn).toBeCalled()
또는 jest.spyOn
추가 사용19.0.0
jest.spyOn(global.console, 'warn')
답변
사용 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'); // 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
쓸 수 없습니다
console.warn = jest.fn().mockImplementation();
...
console.warn.mockRestore();
원본을 복원하지 않기 때문입니다 console.warn()
.
/! \와 함께 mockImplementationOnce()
전화해야합니다 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
다음과 같이 작성할 수도 있습니다.
const assert = console.assert;
console.assert = jest.fn();
...
console.assert = assert;