NodeJS 和 ExpressJS 应用程序因 TAP 而超时
NodeJS and ExpressJS app times out with TAP
我正在尝试使用 tap, and later with supertest 测试 ExpressJS (4.17.8) 和 NodeJS (16.3) 驱动的服务器(应用程序)。首先,我正在测试服务器的实例化,然后是它的路由。
为此,我的应用程序封装在一个连接器 Class 中:
- 有一个 ExpressJS 服务器(应用程序)
- 连接到外部系统
- 注册端点
- 有一个调用 app.listen
的方法启动
所以我有一个这样的测试文件:
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 错误处理风格,则拒绝)
我正在尝试使用 tap, and later with supertest 测试 ExpressJS (4.17.8) 和 NodeJS (16.3) 驱动的服务器(应用程序)。首先,我正在测试服务器的实例化,然后是它的路由。
为此,我的应用程序封装在一个连接器 Class 中:
- 有一个 ExpressJS 服务器(应用程序)
- 连接到外部系统
- 注册端点
- 有一个调用 app.listen 的方法启动
所以我有一个这样的测试文件:
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 错误处理风格,则拒绝)