【问题标题】:How to use Jest with jsdom to test console.log?如何使用 Jest 和 jsdom 来测试 console.log?
【发布时间】:2017-06-03 14:10:22
【问题描述】:

我刚刚开始使用 Jest,并且我已经成功编写了测试 DOM 的单元测试。我有一个library 可以在屏幕上输入内容,所以我可以很好地进行测试。在某些情况下,我的库不会抛出错误,而是会吐出console.warn 或console.log。是否可以使用 Jest 来测试这些控制台消息是否正在发生?

【问题讨论】:

    标签: javascript unit-testing jestjs


    【解决方案1】:

    您可以通过这样的间谍将 console.log 设置为:

    global.console = {
      warn: jest.fn(),
      log: jest.fn()
    }
    
    // run your code
    
    expect(global.console.log).toHaveBeenCalledWith('test')
    

    由于您的测试文件在单独的线程中运行,您无需将 console 重置为原始方法

    【讨论】:

    • 如果您希望控制台仍然可以工作并被监视,请使用sinon.spy
    【解决方案2】:

    假设您想通过打印一条消息来测试这样的函数:

    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') 比覆盖默认的日志记录功能要好得多。
    • 这是今天解决这个问题的最佳方式。谢谢你的回答。
    • 如果 sayHello() 是另一个组件的一部分,则无法使其工作。有什么想法吗?
    猜你喜欢
    • 2017-09-01
    • 2018-03-30
    • 1970-01-01
    • 2021-10-01
    • 2017-12-07
    • 1970-01-01
    • 2022-11-10
    • 2017-04-19
    • 2017-06-02
    相关资源
    最近更新 更多