笑话.如何在第三方库使用时模拟控制台?

Err*_*pro 52 javascript tdd unit-testing jestjs

我试图模拟console.warn /错误,但我不能.我使用第三方库,在其中调用console.warn.我需要测试它被称为或不被称为.在我的测试用例中,我试图存根控制台.但它没有帮助.在那之后,我试图手动模拟控制台,它也没有成功.

console.warn = jest.fn();
testSchema('/app/components/Users/UserItem/UserItemContainer.js');
expect(console.warn).toBeCalled();
Run Code Online (Sandbox Code Playgroud)

没用

console.warn = jest.fn();
testSchema('/app/components/Users/UserItem/UserItemContainer.js');
console.warn('error');
expect(console.warn).toBeCalled();
Run Code Online (Sandbox Code Playgroud)

做得好.但我仍然console.warn node_modules/babel-relay-plugin/lib/getBabelRelayPlugin.js:138在终端看到.谁能帮我?

And*_*rle 96

您必须使用global访问全局上下文中的对象

global.console = {warn: jest.fn()}
expect(console.warn).toBeCalled()
Run Code Online (Sandbox Code Playgroud)

或使用jest.spyOn添加19.0.0

jest.spyOn(global.console, 'warn')
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢`jest.spyOn(...)`因为它更容易清理并且我正在使用TypeScript但也希望抑制输出中的错误,如@ a11smiles所提到的.所以我使用了`jest.spyOn(global.console,"warn").mockImplementation(()=> {})`来防止间谍调用底层的`console.warn` (20认同)
  • 只是让所有人都知道.`global.console = {...}`将_suppress_错误,而`jest.spyOn(...)`不会.您决定是否要在测试中抑制或不抑制错误. (6认同)
  • 有趣的是,这在 Jest 网站上的任何地方都没有记录。我正在搜索,但找不到任何可以解释这一点的内容。 (3认同)
  • 是的,它的工作原理.但有一件事是你在声明global.console后必须要求lib.我做错了.我需要我的lib,然后宣布全局.谢谢. (2认同)
  • 使用打字稿:_error TS2322:输入 '{warn: Mock<{}>; }' 不可分配给类型 'Console'。_ (2认同)

tan*_*y_k 14

使用jest.spyOn()spy.mockRestore()

const spy = jest.spyOn(console, 'warn').mockImplementation();
...
spy.mockRestore();
Run Code Online (Sandbox Code Playgroud)

接受的答案不会还原原始答案,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
Run Code Online (Sandbox Code Playgroud)

您无法编写文字,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
Run Code Online (Sandbox Code Playgroud)

您还可以编写:

const assert = console.assert;
console.assert = jest.fn();
...
console.assert = assert;
Run Code Online (Sandbox Code Playgroud)


Gib*_*boK 7

您可以尝试以下操作,测试并请确保必须clearMockstrue您的笑话配置文件中。

test('it should console warn a message', ()=>{
    jest.spyOn(global.console, 'warn').mockImplementation();

    console.warn('my error');
    expect(console.warn).toBeCalledTimes(1)
    expect(console.warn).toBeCalledWith('my error');
})
Run Code Online (Sandbox Code Playgroud)
module.exports = {
    ...
    clearMocks: true,
    ...
}
Run Code Online (Sandbox Code Playgroud)