【问题标题】:Node.js e2e test for endpoint with async task that is not awaitedNode.js e2e 使用未等待的异步任务测试端点
【发布时间】:2021-05-15 06:59:42
【问题描述】:

我正在 Node.js (NestJS) 中开发一个 API,并有一个调用两个异步服务的端点。等待第一个,其结果在响应中返回。第二个在后台运行,其状态在数据库中存储和更新。

类似这样的:

  @Post()
  async test(): Promise<CustomResponse> {
    const result = await firstAsyncService();

    this.secondAsyncService(result);

    return result;
  }

在这种情况下编写 e2e 测试的常用方法是什么?我正在使用 jest,到目前为止,我只是对测试结果做出断言。

it('test', async () => {
  const response = await request(app.getHttpServer())
   .post('/test')
   .send({});

   expect(response).toEqual(something)
});

【问题讨论】:

  • 最终用户如何得知后台任务已完成?
  • 通过轮询另一个通过 id 返回任务状态的端点。
  • 那你考虑过吗?
  • 我想过轮询直到完成,但感觉不对
  • 为什么不呢?您应该在消费者使用它们时对其进行测试,否则您将与实现过于耦合。

标签: node.js typescript jestjs nestjs


【解决方案1】:

您应该在测试中模拟 this.secondAsyncService(result) 并为其创建单独的测试。

同样不处理承诺也不是好方法,考虑重写这个 enpoint 并使用一些cron 来努力工作,也许rabbitMQ 来处理通信。

【讨论】:

  • 这很有意义,谢谢。此外,在 secondAsyncService 中捕获的任何错误和任务状态都会相应更新。
  • 在后台执行操作对我来说对于低优先级任务很有意义!只是您需要记住正确管理错误,就像(我想)@hero121 在生产中所做的那样!我无法从接受的响应中理解如何编写一个等待调用 this.secondAsyncService(result) 的模拟的测试。
  • @Elia sinon.js,支持spy功能,就是你要找的sinonjs.org/releases/latest/spies
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 2014-09-15
  • 2014-09-06
  • 1970-01-01
  • 2013-02-10
  • 2017-07-22
  • 1970-01-01
相关资源
最近更新 更多