【发布时间】:2017-06-03 14:10:22
【问题描述】:
我刚刚开始使用 Jest,并且我已经成功编写了测试 DOM 的单元测试。我有一个library 可以在屏幕上输入内容,所以我可以很好地进行测试。在某些情况下,我的库不会抛出错误,而是会吐出console.warn 或console.log。是否可以使用 Jest 来测试这些控制台消息是否正在发生?
【问题讨论】:
标签: javascript unit-testing jestjs
我刚刚开始使用 Jest,并且我已经成功编写了测试 DOM 的单元测试。我有一个library 可以在屏幕上输入内容,所以我可以很好地进行测试。在某些情况下,我的库不会抛出错误,而是会吐出console.warn 或console.log。是否可以使用 Jest 来测试这些控制台消息是否正在发生?
【问题讨论】:
标签: javascript unit-testing jestjs
您可以通过这样的间谍将 console.log 设置为:
global.console = {
warn: jest.fn(),
log: jest.fn()
}
// run your code
expect(global.console.log).toHaveBeenCalledWith('test')
由于您的测试文件在单独的线程中运行,您无需将 console 重置为原始方法
【讨论】:
sinon.spy
假设您想通过打印一条消息来测试这样的函数:
function sayHello () { console.log('Hello!') }
您可以使用jest.spyOn 函数来更改console.log 函数的行为方式。
function sayHello () { console.log('Hello!') };
describe('logging "Hello"', () => {
const log = jest.spyOn(global.console, 'log');
sayHello();
it('should print to console', () => {
expect(log).toHaveBeenCalledWith('Hello!');
});
});
或您可以重新定义console 对象并添加具有jest.fn 值的键,如下所示:
describe('sayHello prints "Hello!"', () => {
const log = jest.fn()
global.console = { log }
sayHello()
expect(log).toHaveBeenCalledWith('Hello!')
}
【讨论】:
jest.spyOn(global.console, 'log') 比覆盖默认的日志记录功能要好得多。