node.js - NodeJS 和 ExpressJS 应用程序使用 TAP 超时
问题描述
我正在尝试使用 tap 测试 ExpressJS (4.17.8) 和 NodeJS (16.3) 驱动的服务器(应用程序),然后使用supertest 测试。首先我正在测试服务器的实例化,然后是它的路由。
为此,我的应用程序包装在一个连接器类中:
- 有一个 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 错误处理样式的错误中传递的,则拒绝)
推荐阅读
- php - Api Platform 不正确的上下文响应与自定义操作
- javascript - 来自蓝图覆盖样式的 Normalize.css
- sql - 通过转置减少列数
- debugging - 为什么我的 HLSL 计算着色器中的指令被跳过
- javascript - 为什么使用此 JSON 解析 JSON 响应时出现错误?
- r - 如何在 R 中绘制 3-D 风险平面?
- sql-server - SQL Server 错误:无法继续执行,因为会话处于终止状态
- typescript - TypeScript 类中的命名空间或类别
- python - python中的OS模块如何访问linux中的系统功能?
- python - python - 如何在没有[]包装器的情况下将数组对象转换为元素?