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


84

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터미널에서 보입니다 . 누구든지 나를 도울 수 있습니까?

답변:


145

global전역 컨텍스트에서 개체에 액세스 하려면을 사용해야 합니다.

global.console = {warn: jest.fn()}
expect(console.warn).toBeCalled()

또는 jest.spyOn추가 사용19.0.0

jest.spyOn(global.console, 'warn')

2
네, 작동합니다. 하지만 한 가지는 global.console을 선언 한 후에 lib가 필요하다는 것입니다. 내가 잘못 했어. 나는 내 lib가 필요했고 그 후에 전역으로 선언되었습니다. 감사합니다.
Errorpro

2
이것이 Jest의 웹 사이트 어디에도 문서화되지 않은 방법에 흥미 롭습니다. 나는 검색 중이며 이것을 설명하는 것을 찾을 수 없습니다.
Leonardo

2
typescript 사용 : 오류 TS2322 : 유형 '{경고 : 모의 <{}>; } '은'콘솔 '유형에 할당 할 수 없습니다.
Gerard Brull

8
모두가 알 수 있도록 global.console = {...}것입니다 억제 하는 동안 오류가 발생 jest.spyOn(...)하지 않습니다. 테스트에서 오류를 억제할지 여부를 결정합니다.
a11smiles

38
내가 선호 jest.spyOn(...)는 청소하기 쉽기 때문에 내가 타이프 라이터를 사용하고 있지만 @ a11smiles 언급으로도 출력에 억제 오류를 원하고 있습니다. 내가 사용 그래서 jest.spyOn(global.console, "warn").mockImplementation(() => {})기본에를 통해 호출 스파이 방지하는console.warn
djskinner

73

사용 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;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.