【问题标题】:Can I bypass all setTimeouts in Jest?我可以绕过 Jest 中的所有 setTimeouts 吗?
【发布时间】:2022-01-19 07:42:16
【问题描述】:

我意识到我的测试套件正在运行带有setTimeouts 的代码。就目前而言,如果我使用useFakeTimers,我的测试套件就会中断。我现在无法通过所有测试来一次解决每个问题。我希望通过像这样立即运行他们的回调来绕过所有超时:

jest
  .spyOn(global, 'setTimeout')
  .mockImplementation((callback) => callback());

TS 告诉我This expression is not callable. No constituent of type 'TimerHandler' is callable.

我也试过这样破解它:

// in beforeEach
jest.spyOn(global, 'setTimeout');

// in test
const callback = mocked(global.setTimeout).mock.calls[0][0] as Function;
callback();

我很确定我过去做过这样的事情,以确保任何 setTimeout 回调立即运行而不是等待。我怎样才能做到这一点?我知道这不是最好的主意,但我现在有时间限制。

【问题讨论】:

    标签: typescript jestjs


    【解决方案1】:

    您永远不应该,但从技术上讲,setTimeout 可以获取一个字符串,该字符串将得到eval'd。我假设TimerHandler 类型涵盖了这个用例。所以类型不会让你假设回调总是一个函数。

    您应该能够通过仔细检查回调是否是一个函数来修复它:

    jest
      .spyOn(global, 'setTimeout')
      .mockImplementation((callback) => typeof callback === 'function' ? callback() : null);
    

    在我自己的环境中使用它,我通过了这个测试就好了:

    describe('foo', () => {
      it('foo', () => {
        jest
          .spyOn(global, 'setTimeout')
          .mockImplementation((callback) => (typeof callback === 'function' ? callback() : null))
        let foo = 0
        setTimeout(() => (foo = 123), 100000)
        expect(foo).toEqual(123)
      })
    })
    

    【讨论】:

    • 谢谢,你是对的,我不应该这样做,但现在我需要进行测试,然后再单独回去删除这个黑客​​。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多