#node.js #express #jestjs #supertest
Вопрос:
У меня есть следующие настройки в каждом из моих тестовых файлов:
const supertest = require('supertest');
const app = require('../../app.run');
let request = null;
let server = null;
beforeAll((done) => {
server = app.listen(done);
request = supertest.agent(server);
});
afterAll((done) => {
sequelize.close();
server.close(done);
});
Мой метод прослушивания приложения выглядит следующим образом:
app.listen(process.env.APP_PORT, () => {
logger.info('Server is running on port ' process.env.APP_PORT);
});
module.exports = app;
Теперь, когда я запускаю все тесты с помощью jest, сервер, похоже, закрыт неправильно, так как я получаю ошибку EADDRINUSE:
Test suite failed to run
listen EADDRINUSE: address already in use :::8081
32 | app.use('/api', require('./app.routes'));
33 |
> 34 | app.listen(process.env.APP_PORT, () => {
| ^
35 | logger.info('Server is running on port ' process.env.APP_PORT);
36 | });
37 |
at Function.listen (node_modules/express/lib/application.js:618:24)
at Object.<anonymous> (app.run.js:34:5)
at Object.<anonymous> (test/e2e/auth-controller.test.js:3:13)
И это пример теста:
it("should register a user", async () => {
await request
.post('/api/users/signup')
.send({email, password, name, surname})
.expect(200);
const user = await User.findOne({where: {email}});
expect(user.active_token).toBeNull();
expect(user.enabled).toBeTruthy();
});
Есть идеи о том, как правильно закрыть сервер? Заранее спасибо за вашу помощь
Комментарии:
1. Зачем вам нужно запускать экспресс — сервер?
2. Мне это не нужно, я бы с удовольствием запустил сервер один раз для всех наборов тестов, но я не нашел решения
3. Не начинай это, просто
request = supertest.agent(app);
4. к сожалению, это не работает, он все еще пытается вызвать его дважды
5. вы удалили
server = app.listen(done);
линию?
Ответ №1:
Похоже, вы неправильно назначаете СЕРВЕР. Я собираюсь предположить, что вы слушаете из index.js так что ваш index.js должно выглядеть так, как показано ниже.
const express = require('express');
const app = express();
//...
let port = process.env.PORT || 3000;
if (process.env.NODE_ENV === "test")
port = 4000;
const server = app.listen(port, () => console.log(`Listening on port ${port}`));
module.exports = server;
Затем в вашем тестовом файле ваш код должен включать следующее:
const request = require('supertest');
let server;
describe('/your/path', () => {
beforeEach(() => {
server = require('/path/to/index.js');
});
afterEach(() => {
server.close();
});
it("should register a user", async () => {
cont res = await request(server)
.post('/api/users/signup')
.send({
email: 'myemail@mail.com',
name: 'John Doe'
});
...
expect(res.status).toBe(200);
...
});
});
Постарайтесь не усложнять ситуацию. Я бы посоветовал вам иметь ПОЛЬЗОВАТЕЛЬСКУЮ МОДЕЛЬ вместо ввода данных, как вы это делали.