【问题标题】:Jest - test an async default export开玩笑 - 测试异步默认导出
【发布时间】:2020-01-03 21:44:43
【问题描述】:

假设我有my-file.ts:

async function run() {

  await new Promise(resolve => {
    setTimeout(() => resolve(), 3000);
  });

  setTimeout(() => console.log('hello'), 5000);

}

export default run();

我想用 Jest 来测试它。如果我这样做:

it('should wait until all code has executed', async () => {
  const start = new Date();
  console.log('Waiting...', new Date());

  await require('./my-file').default;

  const stop = new Date();
  console.log(`done after ${(stop.getTime() - start.getTime()) / 1000} s`);
});

结果是:

  console.log test/tmp.test.ts:3
    Waiting... 2020-01-03T11:56:59.822Z

  console.log test/tmp.test.ts:8
    done after 3.009 s

这是有道理的。但是当我编译并运行my-file.ts时,节点等待所有超时都被清除,并且所有控制台日志都正确显示:

$ tsc my-file.ts && node my-file.js
hello
$

我想重现 Node 的行为,即等待所有异步代码执行。我怎么能开玩笑呢?

另外,谁能解释一下为什么下面的内容根本不等待?

it('should wait until all code has executed', async () => {
  await require('./my-file');
});

【问题讨论】:

    标签: node.js promise jestjs


    【解决方案1】:

    问题是您的 Promise resolves 在 3 秒后运行,并且来自 jest 的测试开始运行,因为您使用 await require('./my-file').default; 阻止执行,直到 Promise 为 resolved 或 rejected。您的第二次超时只是在 5 秒后将超时回调添加到事件队列中。

    要复制等待 5 秒,请在第二次超时中解决 Promise。如果你返回一个新的承诺,你也不需要async/await。

    function run() {
        return new Promise(resolve => {
            setTimeout(() => console.log('hello after 3 sec'), 3000);
            setTimeout(() => resolve(), 5000);
        });
    }
    
    export default run();
    

    【讨论】:

      猜你喜欢
      • 2018-02-22
      • 1970-01-01
      • 2020-10-08
      • 2021-09-25
      • 1970-01-01
      • 2022-01-01
      • 2020-03-11
      • 2018-04-13
      • 2018-11-23
      相关资源
      最近更新 更多