Неудачный тест шутки с «connect ECONNREFUSED 127.0.0.1:80», когда приложение прослушивает порт 3000 (экспресс и супертест)

#node.js #express #jestjs #supertest #econnrefused

#node.js #экспресс #jestjs #супертест #экономичный

Вопрос:

Я изо всех сил пытаюсь устранить ошибку в своем тесте jest с помощью супертеста, я думаю, что это проблема с моим тестом, а не с моим кодом.

Моя проблема

Я пытаюсь создать внутренний API, используя node.js и выразить, используя TDD. У меня есть следующие файлы для настройки сервера:

 //in app.js const express = require('express'); const app = express();  app.post('api/1.0/users', (req, res) =gt; {  return res.send(); });  module.exports = app;  //in index.js const app = require('./app'); const port = 3000;  app.listen(port, () =gt; console.log(`listening on port: ${port}`));  

Когда я запускаю сервер, он успешно запускается на порту 3000. Однако, когда я выполняю следующий тест:

 //in UserRegister.test.js const request = require('supertest'); const app = require('../app'); //this is in a __tests__ subdir hence '..'  it('returns 200 OK when sign-up request is valid', (done) =gt; {  request(app)  .post('api/1.0/users')  .send({  first_name: 'person',  last_name: 'one',  password: '123',  })  .expect(200, done); });  

Проблема

Я понял ошибку connect ECONNREFUSED 127.0.0.1:80 .

Я думаю, это говорит мне о том, что тест пытается подключиться к порту 80, однако на порту 80 не настроен сервер, поэтому соединение отклонено, но он должен пытаться подключиться к порту 3000.

То, что я пытался

  • Насколько мне известно, все пакеты установлены надлежащим образом
  • Я попробовал хакерское решение заставить мой сервер прослушивать порт 80, но это вызывает ту же проблему.
  • прочтите документы supertest, чтобы попробовать альтернативные решения
  • Попробовал следующий другой синтаксис на случай, если это была очевидная синтаксическая проблема, которую я неправильно истолковал:
 it('returns 200 OK when sign-up request is valid', async () =gt; {  const response = await request(app).post('api/1.0/users')  .send({  first_name: 'person',  last_name: 'one',  password: '123',  })  expect(response.statusCode).toEqual(200); });  

Что я упускаю? Я все больше убеждаюсь, что это мое непонимание того, как работает супертест, но я, похоже, не могу понять, в чем проблема.

Я просто ищу, чтобы тест либо прошел, либо не прошел (либо получил ответ 200 или 404), но только после того, как он подключится к правильному порту (т. Е. Я застрял на первом препятствии).

Комментарии:

1. Добро пожаловать в Stack Overflow. Я надеюсь, что вы продолжите задавать вопросы такого уровня качества. Попробуйте поместить строку export app в нижней части app.js файла, чтобы строка тестового файла const app = require('../app') могла получить приложение, созданное express() .

Ответ №1:

Проблема в URI. Я только что попробовал тест, который URL-адрес не начинает использоваться / , и получил ту же ошибку. Так что вместо этого

 .post('api/1.0/users')  

использовать

 .post('/api/1.0/users')  

может решить проблему.

Комментарии:

1. Это сработало, спасибо!