[英]How to create/close the server when running integration tests using Express and Supertest in NodeJS
我的问题是我在运行测试时总是收到“ Address already in use::3000
”错误。
这是我所拥有的:
package.json
"scripts": {
"test": "jest --watchAll --verbose --runInBand --maxWorkers=1"
},
服务器.js
const winston = require('winston');
const express = require('express');
const app = express();
module.exports = function() {
const port = process.env.PORT || 3000;
return app.listen(port, () => { winston.info(`Listening on port ${port}...`) });
}
auth.test.js(仅显示一项测试)
describe('auth middleware', () => {
beforeEach(() => { server = require('../../startup/server'); });
afterEach(async () => {
await Category.remove({});
await server.close();
});
let token;
const exec = () => {
return request(server)
.post('/api/categories')
.set('x-auth-token', token)
.send({ name: 'category1' });
}
beforeEach(() => {
token = new User().generateAuthToken();
});
it('should return 200 if token is valid', async () => {
const res = await exec();
expect(res.status).toBe(200);
});
});
我不确定我做错了什么,stackoverflow 上的大多数答案都指向将runInBand
或maxWorkers=1
添加到package.json
或等待server.close()
。 没有什么对我有用。
PS:我之前在一次测试中遇到过这个问题,但是在将服务器逻辑提取到单独的文件(来自index.js
)之后,现在所有测试都因这个错误而失败,所以很明显我遗漏了一些东西。
而且我没有运行应用程序,只是我的测试。
这是一个最小的工作示例:
server.js
:
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const port = process.env.PORT || 3000;
app.use(bodyParser.json());
app.post('/api/categories', (req, res) => {
console.log(req.body);
res.sendStatus(200);
});
if (require.main === module) {
app.listen(port, () => {
console.info(`Listening on port ${port}...`);
});
}
module.exports = app;
auth.test.js
:
const request = require('supertest');
const server = require('./server');
describe('auth middleware', () => {
const exec = () => {
return request(server)
.post('/api/categories')
.set('x-auth-token', 'token')
.send({ name: 'category1' });
};
it('should return 200 if token is valid', async () => {
const res = await exec();
expect(res.status).toBe(200);
});
});
集成测试结果:
PASS src/stackoverflow/58569731/auth.test.js (8.919s)
auth middleware
✓ should return 200 if token is valid (70ms)
console.log src/stackoverflow/58569731/server.js:8
{ name: 'category1' }
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 9.993s, estimated 10s
启动 HTTP web 服务器:
node /Users/ldu020/workspace/github.com/mrdulin/jest-codelab/src/stackoverflow/58569731/server.js
Listening on port 3000...
npm scripts
:
"test": "jest --detectOpenHandles --verbose",
源码: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/58569731
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.