首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jest -测试异步默认导出

Jest -测试异步默认导出
EN

Stack Overflow用户
提问于 2020-01-03 20:08:03
回答 1查看 160关注 0票数 0

假设我有my-file.ts

代码语言:javascript
复制
async function run() {

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

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

}

export default run();

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

代码语言:javascript
复制
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`);
});

结果是:

代码语言:javascript
复制
  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时,节点等待所有超时清除,并且所有控制台日志都正确显示:

代码语言:javascript
复制
$ tsc my-file.ts && node my-file.js
hello
$

我想重现Node的行为,即等待所有异步代码执行完毕。我怎么才能用jest做到这一点呢?

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

代码语言:javascript
复制
it('should wait until all code has executed', async () => {
  await require('./my-file');
});
EN

回答 1

Stack Overflow用户

发布于 2020-01-03 21:44:44

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

要复制等待5秒,请在第二个超时中解析Promise。此外,如果您返回新的promise,则不需要async/await

代码语言:javascript
复制
function run() {
    return new Promise(resolve => {
        setTimeout(() => console.log('hello after 3 sec'), 3000);
        setTimeout(() => resolve(), 5000);
    });
}

export default run();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59578384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档