【发布时间】:2022-02-12 01:11:10
【问题描述】:
我正在尝试在我的TypeScript 项目中使用jest 和superTest 测试我的简单端点,但我收到listen EADDRINUSE: address already in use :::3000 错误。
- 我有一个
app.ts用于express工作。这是我在测试文件中导入的那个。 - 我有一个启动服务器的
server.ts文件。我没有在我的测试中使用它。
我在stackoverflow 上阅读了一些类似的问题,人们建议终止该进程。我的问题仅限于我的Integration Test。如果我使用Postman 进行测试,它工作正常。
问题:
- 我应该停止
afterEach中的服务器吗?我不能 100% 确定这是否是一种有效的方法。
代码如下:
app.ts
import 'reflect-metadata';
import * as express from 'express';
import cors from 'cors';
import helmet from 'helmet';
import app from './server';
import routes from './routes/routes';
import errorHandler from './utils/errorHandler';
import LoggerService from './services/logger.service';
async function bootstrap() {
app.disable('x-powered-by');
app.use(cors());
app.use(helmet());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
routes(app);
/**
* Configure error handler
*/
errorHandler(app);
}
// Need for testing purpose
export default app;
bootstrap()
.then(() => {
new LoggerService().logger.info('Server is up');
})
.catch((error) => {
new LoggerService().logger.error(`Unknown error. ${error.message}`);
});
server.ts
import * as dotenv from 'dotenv';
import express from 'express';
import LoggerService from './services/logger.service';
dotenv.config();
const server = express();
/**
* App Variables
*/
if (!process.env.PORT) {
process.exit(1);
}
/**
* Setup listener port
*/
const PORT: string | number = process.env.PORT || 3000;
server.listen(PORT, () => {
new LoggerService().logger.info(`Listening on port ${PORT}`);
});
export default server;
route.ts
import { Application } from 'express';
import container from '../ioc.container';
import HealthController from '../controllers/health.controller';
export default function RouteManager(application: Application) {
const healthController = container.get<HealthController>(HealthController);
application.get('/healthStatus', healthController.healthCheck.bind(healthController));
}
some.spec.ts
import { mockHealthCheck } from '../mockData/health.mockData';
import app from '../app';
import request from 'supertest';
describe('GET /healthStatus API Tests', () => {
it('Receives 200 on successful call', async () => {
const result = await request(app).get('/healthStatus');
expect(result.statusCode).toEqual(200);
expect(result.body.description).toEqual(mockHealthCheck.description);
expect(result.body.status).toEqual(mockHealthCheck.status);
});
it('Receives 404 - Not Found on unsuccessful call', async () => {
const result = await request(app).get('/invalidEndPoint');
expect(result.statusCode).toEqual(401);
});
});
【问题讨论】:
标签: node.js typescript express supertest