Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将Jest与jsdom结合使用来测试console.log?_Javascript_Unit Testing_Jestjs - Fatal编程技术网

Javascript 如何将Jest与jsdom结合使用来测试console.log?

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

我刚刚开始使用Jest,我已经成功地编写了测试DOM的单元测试。我有一个可以在屏幕上键入内容的程序,所以我可以很好地进行测试。在某些情况下,我的库不会抛出错误,而是会抛出一个
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