首页 > 解决方案 > NodeJS 和 ExpressJS 应用程序使用 TAP 超时

问题描述

我正在尝试使用 tap 测试 ExpressJS (4.17.8) 和 NodeJS (16.3) 驱动的服务器(应用程序)然后使用supertest 测试。首先我正在测试服务器的实例化,然后是它的路由。

为此,我的应用程序包装在一个连接器类中:

所以我有一个这样的测试文件:

import test, { Test } from "tape-promise/tape";

test("connects to X", async (t: Test) => {

  connector = new Connector();

  await connector.ConnectToExternalSystem(); // connects to external system
  await connector.registerEndpoints(); // e.g., sets to the Express app: app[get](/endpoint)...
  await connector.listen(); // gets stuck?
  t.ok(connector);
  t.end();

我的问题是,对于我执行的每个测试,tap 似乎都卡在 connector.listen() 中(Jest 也会发生) - 导致测试超时。

我的项目和测试是用 Typescript 4.3.5 编写的。我正在使用以下 npm 脚本来运行测试:

"test": "tap --ts --jobs=1 --node-arg=--max-old-space-size=4096 --timeout=15 --branches=45 --functions=70 --lines=75 --statements=75 \"src/test/{unit,integration}/\"",

有什么我做错了吗?感谢您对此的建议。谢谢。

标签: node.jstypescriptexpresstestingtap

解决方案


取决于真正的实现是Connector什么样的。假设它在后台.listen()调用 express'listen 的方法可能是您没有处理成功回调,或者它没有通过承诺的resolve回调正确连接到返回的承诺。

所以像这样的东西可以工作(粗略的伪代码,未经测试):

class Connector {
  listen(): Promise<void> {
    return new Promise((resolve, reject) => {
      this.expressApp.listen((err: Error) => {
         if (err) {
           reject(err);
         } else {
           resolve();
         }
      });
    });
  }
}

上面所做的是确保在调用回调后返回的 Promise 解决(或者如果回调是在标准 NodeJS 错误处理样式的错误中传递的,则拒绝)


推荐阅读