【问题标题】:Test millisecods argument on setTimeout with jest用玩笑测试 setTimeout 上的毫秒参数
【发布时间】:2021-03-16 00:38:46
【问题描述】:

我有一种方法可以使用带有 setTimeout 的 Promise 来触发暂停:

pause = ({ time } = {}) => {
  const pauseTime = time || 500;

  return new Promise((resolve) => {
    setTimeout(() => {
      resolve()
    }, pauseTime)
  })
}

我想开个玩笑测试一下,期待timeout函数得到pause方法接收到的时间参数。

jest.useFakeTimers();

const setTimeoutSpy = spyOn(window, 'setTimeout')
const pausePromise = pause({ time: 2500 })


await jest.runAllTimers();

pausePromise.then(() => {
  expect(setTimeoutSpy).toHaveBeenCalledTimes(1);
  expect(setTimeoutSpy).toHaveBeenCalledWith(2500);
})

jest.useRealTimers();
return pausePromise

我尝试过模拟和间谍。也尝试过没有计时器并等待承诺。但我总是得到相同的结果:预计 spy 被调用了一次,但它被调用了 0 次。

有什么想法吗?

谢谢!

【问题讨论】:

  • 你正在监视 setTimeout 你调用了你正在测试的方法。你需要事先做好。
  • 你是对的。我在方法之前移动了间谍,但仍然无法正常工作。

标签: javascript jestjs mocking settimeout spy


【解决方案1】:

我终于找到了问题所在。 这是间谍实现的问题:

  1. 我在做spyOn(... 而不是jest.spyOn(...
  2. 我将监视的对象从 window 更改为 global

感谢大家的cmets!

【讨论】:

    【解决方案2】:

    它适用于jest: ^24.9.0

    例如

    index.ts:

    export const pause = ({ time } = {} as any) => {
      const pauseTime = time || 500;
    
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve();
        }, pauseTime);
      });
    };
    

    index.test.ts:

    import { pause } from './';
    
    jest.useFakeTimers();
    
    describe('65135435', () => {
      it('should pass', async () => {
        const setTimeoutSpy = jest.spyOn(window, 'setTimeout');
        const pausePromise = pause({ time: 2500 });
    
        jest.runAllTimers();
    
        await pausePromise;
        expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 2500);
        expect(setTimeoutSpy).toHaveBeenCalledTimes(1);
      });
    });
    

    单元测试结果:

     PASS  src/stackoverflow/65135435/index.test.ts
      65135435
        ✓ should pass (6ms)
    
    ----------|----------|----------|----------|----------|-------------------|
    File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
    ----------|----------|----------|----------|----------|-------------------|
    All files |      100 |    33.33 |      100 |      100 |                   |
     index.ts |      100 |    33.33 |      100 |      100 |               1,2 |
    ----------|----------|----------|----------|----------|-------------------|
    Test Suites: 1 passed, 1 total
    Tests:       1 passed, 1 total
    Snapshots:   0 total
    Time:        4.119s
    

    【讨论】:

      猜你喜欢
      • 2022-01-26
      • 2018-02-15
      • 1970-01-01
      • 2021-02-10
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 2018-01-29
      相关资源
      最近更新 更多