Javascript 如何将Jest与jsdom结合使用来测试console.log?
我刚刚开始使用Jest,我已经成功地编写了测试DOM的单元测试。我有一个可以在屏幕上键入内容的程序,所以我可以很好地进行测试。在某些情况下,我的库不会抛出错误,而是会抛出一个Javascript 如何将Jest与jsdom结合使用来测试console.log?,javascript,unit-testing,jestjs,Javascript,Unit Testing,Jestjs,我刚刚开始使用Jest,我已经成功地编写了测试DOM的单元测试。我有一个可以在屏幕上键入内容的程序,所以我可以很好地进行测试。在某些情况下,我的库不会抛出错误,而是会抛出一个console.warn或console.log。可以使用Jest测试这些控制台消息是否正在发生吗?您可以通过间谍将console.log设置为: global.console = { warn: jest.fn(), log: jest.fn() } // run your code expect(global
console.warn
或console.log
。可以使用Jest测试这些控制台消息是否正在发生吗?您可以通过间谍将console.log设置为:
global.console = {
warn: jest.fn(),
log: jest.fn()
}
// run your code
expect(global.console.log).toHaveBeenCalledWith('test')
describe('sayHello prints "Hello!"', () => {
const log = jest.fn()
global.console = { log }
sayHello()
expect(log).toHaveBeenCalledWith('Hello!')
}
由于测试文件在单独的线程中运行,您不需要将
控制台
重置为原始方法假设您希望通过打印消息来测试这样的函数:
function sayHello () { console.log('Hello!') }
您可以使用jest.spyOn
函数更改console.log
函数的行为方式
函数sayHello(){console.log('Hello!'};
描述('记录“你好',()=>{
const log=jest.spyOn(global.console,'log');
你好;
它('应该打印到控制台',()=>{
期望(log.toHaveBeenCalledWith('Hello!'));
});
});
或您可以重新定义控制台
对象,并添加一个带有jest.fn
值的键,如下所示:
global.console = {
warn: jest.fn(),
log: jest.fn()
}
// run your code
expect(global.console.log).toHaveBeenCalledWith('test')
describe('sayHello prints "Hello!"', () => {
const log = jest.fn()
global.console = { log }
sayHello()
expect(log).toHaveBeenCalledWith('Hello!')
}
这应该是正确的答案
jest.spyOn(global.console,'log')
比覆盖当时默认的日志功能要好得多。这是目前最好的方法。谢谢您的回答。如果sayHello()是另一个组件的一部分,则无法实现此功能。有什么想法吗?如果你想让控制台继续工作并被监视,请使用sinon.spy