开玩笑-测试异步默认导出

时间:2020-01-03 12:08:03

标签: node.js promise jestjs

假设我有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');
});

1 个答案:

答案 0 :(得分:0)

问题在于3秒钟后您的Promise resolves和来自笑话的测试会运行,因为您用await require('./my-file').default;阻止了执行,直到Promise为resolvedrejected。您的第二次超时只会在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();