NodeJS 和 ExpressJS 应用程序因 TAP 而超时

NodeJS and ExpressJS app times out with TAP

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

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

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

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}/\"",

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

取决于 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 错误处理风格,则拒绝)