[javascript] Jest : 타사 라이브러리에서 사용할 때 콘솔을 모의하는 방법은 무엇입니까?

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;


답변