在此测试代码中,

test('test', async () => {
  jest.useFakeTimers();

  const cb = jest.fn();
  const func = jest.fn().mockResolvedValueOnce(1);

  setTimeout(async () => {
    setTimeout(() => {
      cb();
    }, 1000);
  }, 1000);

  jest.runAllTimers();
});

因为jest.runAllTimers()模拟了足够的流逝时间,所以cb()被击中了.但在这一次,

test('test', async () => {
  jest.useFakeTimers();

  const cb = jest.fn();
  const func = jest.fn().mockResolvedValueOnce(1);

  setTimeout(async () => {
    await func();
    setTimeout(() => {
      cb();
    }, 1000);
  }, 1000);

  jest.runAllTimers();

  expect(cb).toHaveBeenCalledTimes(1);
});

cb()永远不会命中.

我应该如何修改这段代码的测试,以使它正确地达到cb并且测试通过?

推荐答案

您的计时器是在promise (从func返回)解析后定义的.因此,为了运行计时器,您必须等待计时器启动.你可以通过等待func返回的promise 来做到这一点.

要访问由JEST模拟函数返回的数据,可以使用It‘s .mock property

例如:

test('test', async () => {
    jest.useFakeTimers();
  
    const cb = jest.fn();
    const func = jest.fn().mockResolvedValueOnce(1);
  
    setTimeout(async () => {
      await func();
      setTimeout(() => {
        cb();
      }, 1000);
    }, 1000);
  
    jest.runAllTimers();
    await func.mock.results[0].value
    jest.runAllTimers();
  
    expect(cb).toHaveBeenCalledTimes(1);
  });

Node.js相关问答推荐

无法验证叶签名|无法验证第一个证书

如何在.npmrc中添加 comments ?

类扩展值[object object]不是构造函数或null

我收到警告:发现函数rs-ms-v1不受支持的运行时nodejs18.x× 不受支持的运行时

SvelteKit应用程序立即退出,没有错误

在mongoose虚拟属性中处理异步操作

如何在带有 JS 的 Nodejs 中使用没有 Async 方法的 Await

suppress AWS SDK v2 弃用消息

nvm / node / npm: node 12 的 npm 比 node 14 的更新?

Mongodb 从文档中获取聚合结果中的特定属性

NodeJs 过滤掉目录异步

您如何写入 aws lambda 实例的文件系统?

来自 Node-aws 的 Dynamo Local:所有操作都失败无法对不存在的表执行操作

从 Node.js 应用程序查询 Heroku 托管的 Postgres 数据库时出现自签名证书错误

如何在 Mongoose 模式中设置数组大小限制

如何运行用 TypeScript 编写的 Mocha 测试?

对不同对象中的函数使用相同的键时,V8 中的函数调用缓慢

如何使用 Node.js、Express 和 Mongoose 进行身份验证?

从 React(同构应用程序)进行 API 调用时出现Access-Control-Allow-Origin问题

node.js 服务器和 HTTP/2 (2.0) 与 express.js