使用 supertest 在快速服务器上开玩笑超时
Posted
技术标签:
【中文标题】使用 supertest 在快速服务器上开玩笑超时【英文标题】:jest timeout on express server using supertest 【发布时间】:2021-11-13 04:10:47 【问题描述】:我正在尝试使用jest
和supertest
测试快速应用的端点。这是我的文件:
// backend/tests/integration.test.ts
const server = require('../server');
const supertest = require('supertest');
const appTest = supertest(server);
describe('Integration tests', () =>
it('GET /api/ping', async () =>
const expected = status: 200, body: success: true
const res = await appTest.get('/api/ping');
expect(res.status).toEqual(expected.status);
expect(res.body).toEqual(expected.body);
);
);
// backend/server.ts
import app from './src/app';
const PORT = 3000;
const server = app.listen(PORT, () =>
console.log(`Server running on port $PORT`);
);
export default server;
// backend/src/app.ts
const express = require('express');
const app = express();
app.get('/api/ping', (req, res) =>
res.status(200).json(
'success': true
);
);
export default app;
我不断收到错误:
TypeError: app.address is not a function
并且堆栈跟踪说错误就行了:
8 | it('GET /api/ping', async () =>
9 | const expected = status: 200, body: success: true
> 10 | const res = await appTest.get('/api/ping');
| ^
11 | expect(res.status).toEqual(expected.status);
12 | expect(res.body).toEqual(expected.body);
13 | );
我的配置如下:
// package.json
...
"scripts":
"test": "jest"
// jest.config.js
module.exports =
preset: 'ts-jest',
modulePathIgnorePatterns: ["<rootDir>/dist/"],
transform:
'^.+\/*.(ts|tsx)?$': 'ts-jest'
;
// babel.config.js
module.exports =
presets: ['@babel/preset-env']
;
// tsconfig.json
"compilerOptions":
"module": "commonjs",
"esModuleInterop": true,
"target": "es6",
"moduleResolution": "node",
"sourceMap": true,
"outDir": "dist"
,
"lib": ["es2015"],
"exclude": [
"../node_modules"
],
"include": [
"./**/*.ts"
]
我不知道为什么会这样。已尝试谷歌搜索和阅读有关堆栈溢出超时错误的信息,但无济于事。
【问题讨论】:
【参考方案1】:在backend/tests/integration.test.ts只使用没有http.createServer
的服务器
应该做出改变:
-
改为
const appTest = supertest(http.createServer(server));
使用const appTest = supertest(server);
如果你使用 async-await 从你不需要的签名中删除 done ,将测试签名更改为it('GET /api/ping', async () => ...
删除规范末尾的 done 调用
添加到 jest.config allowJs: true
,
比较依赖的版本
package.json
"name": "node",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts":
"test": "jest"
,
"author": "",
"license": "ISC",
"dependencies":
"babel": "^6.23.0",
"express": "^4.17.1",
"jest": "^27.2.0",
"supertest": "^6.1.6",
"ts-jest": "^27.0.5"
,
"devDependencies":
"@types/jest": "^27.0.1"
【讨论】:
这使得测试运行,但我在做await appTest.get('/api/ping')
时得到app.address is not a function
请更新代码和输出
更新了代码和输出
更新我的答案,看起来像打字稿翻译问题尝试更改为 js 只是为了健全导入和 module.exports = server
解决了!泰!!! :)以上是关于使用 supertest 在快速服务器上开玩笑超时的主要内容,如果未能解决你的问题,请参考以下文章
在 node.js 服务器上使用 supertest/superagent 读取响应输出缓冲区/流
用 Jest 和 supertest 测试 responsebody
使用 mocha 测试 express 服务器并使用异步初始化程序进行 supertest 调用请求两次
MongooseError - 开玩笑地连接到 mongoosedb NestJS 测试用例时,操作 users.xxx() 缓冲在 10000 毫秒后超时