Я не могу тестировать экспресс-приложения в cloud9 с помощью супертеста: даже базовые тесты выдают ECONNREFUSED.

Действия по воспроизведению :

  • создать новую рабочую область nodejs
  • npm установить экспресс-супертест
  • создайте файл fails.js, содержащий следующий код:

    // Code from supertest page   
    var request = require('supertest')
    , express = require('express');
    var app = express();
    app.get('/user', function(req, res){
      res.send(201, { name: 'tobi' });
    });
    request(app)
    .get('/user')
    .expect('Content-Type', /json/)
    .expect('Content-Length', '20')
    .expect(201)
    .end(function(err, res){
       if (err) throw err;
     });
    

Затем запустите node fails.js на терминале: Ошибка: подключите ECONNREFUSED

jmbarbier@test:~/606588 $ node fails.js
/var/lib/stickshift/522b68364382ecb9de0000ac/app-root/data/606588/fails.js:16
if (err) throw err
               ^
Error: connect ECONNREFUSED
at errnoException (net.js:906:11)
at Object.afterConnect [as oncomplete] (net.js:897:19)

Понятия не имею, что происходит ...

======== РЕДАКТИРОВАТЬ

Благодаря принятому решению, вот код для использования mocha для тестирования экспресс-приложения в cloud9 или любой среде, ограничивающей доступный IP / порт: (works.js)

var request = require('supertest'), server;

before(function(done) {
    var express = require('express');
    var app = express();
    app.get('/user', function(req, res){
      res.send(201, { name: 'tobi' });
    });
    server = app.listen(process.env.PORT, process.env.IP, done);
});

after(function () {
    server.close()
})

describe("Testing /user", function() {
    it("Should return data", function(done) {
        request = request('http://' + process.env.IP + ':' + process.env.PORT);

        request.get('/user')
          .expect('Content-Type', /json/)
          .expect('Content-Length', '20')
          .expect(201)
          .end(function(err, res){
            if (err) throw err;
            done()
          });

    })


})

Затем mocha works.js ...

0
jmbarbier 8 Сен 2013 в 13:59

1 ответ

Лучший ответ

После быстрого просмотра кода супертеста и смутных знаний о том, как работает Cloud9, выяснилось, что показанный вами код заставляет приложение Express выбрать случайный порт (если приложение еще не прослушивает) и слушать.

Это не будет работать с Cloud9, потому что, насколько мне известно, назначенные адреса прослушивания являются адресами обратной связи и проксируются на страницу вашего проекта. Вместо этого используйте этот код:

var request = require('supertest')
var express = require('express');
var app = express();

app.get('/user', function(req, res) {
  res.send(201, { name: 'tobi' });
});

app.listen(process.env.PORT, process.env.IP);

Таким образом, вы назначаете правильный адрес и порт для приложения Express, и супертест не будет назначать ему случайный порт. Затем используйте такой супертест:

request = request('http://' + process.env.IP + ':' + process.env.PORT);
request.get('/user')
  .expect('Content-Type', /json/)
  .expect('Content-Length', '20')
  .expect(201)
  .end(function(err, res) {
    if (err) throw err;
  });
3
hexacyanide 8 Сен 2013 в 19:27
Да, но это означает, что я должен запустить сервер перед тестами, а затем убить его (вручную ?? есть ли способ убить его в конце тестов - я использую мокко) после ...
 – 
jmbarbier
8 Сен 2013 в 21:29
Вы можете использовать process.exit() для выхода из процесса, app.close() чтобы остановить прослушивание HTTP-сервером (непроверенное утверждение).
 – 
hexacyanide
8 Сен 2013 в 23:02
Закрыть заявку :-) не app.close (), но вы можете закрыть сервер, возвращенный app.listen ().
 – 
jmbarbier
9 Сен 2013 в 02:35