Закрытие экспресс-сервера после запуска спецификаций жасмина

Я пытаюсь настроить жасминовое тестирование моего экспресс-сервера. Я запускаю новый сервер с каждой спецификацией и пытаюсь выключить его после завершения каждой спецификации. К сожалению, сервер, похоже, не выключается... что делает невозможным запуск более одной спецификации.

сервер.js:

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

exports.start = function(config){
  if(!this.server){
    app.get('/', function(req, res){
      res.status(200);
      res.end();
    })

    this.server = app.listen(config.port, function(){
      console.log('Server running on port %d', config.port);
    });
  }
};

exports.close = function(){
  this.server.close();
}

маршрутизация-spec.js:

var server = require('./path/to/server.js');
var http = require('http');

describe('express server', function () {
  beforeEach(function () {
    server.start({port: 8000});
  });

  afterEach(function () {
    server.close();
  });

  describe('/', function () {
    it('should return 200', function (done) {
      http.get('http://localhost:8000', function (res) {
        expect(res.statusCode).toBe(200);
        done();
      });
    });
  });
});

Первая спецификация проходит, как и ожидалось, но терминал никогда не завершает тест (т. е. сервер все еще работает), и любые последующие добавленные тесты вызывают выдачу «ECONREFUSED».


person jvanstry    schedule 22.04.2014    source источник


Ответы (2)


Вы можете использовать модуль npm server-destroy. server-destroy отслеживает все соединения, а затем закрывает их, когда вызывается destroy. Кроме того, метод destroy принимает обратный вызов, поэтому вы должны передать свою «готовую» функцию вашему методу destroy... Ниже скопировано описание модуля npm с добавлением обратного вызова в вызове destroy.

var enableDestroy = require('server-destroy');

var server = http.createServer(function(req, res) {
  // do stuff, blah blah blah
});

server.listen(PORT);

// enhance with a 'destroy' function
enableDestroy(server);

// some time later...
server.destroy(done);

Если открытые соединения не являются проблемой, вы можете просто передать функцию done функции закрытия, server.close(done), как описано в этом сообщении Как правильно выполнить модульное тестирование сервера Express

person user3071643    schedule 06.12.2016

Мне никогда не удавалось надежно закрыть Express программно. Вместо этого я рекомендую использовать что-то вроде jasmine-before-all для запуска сервера. один раз для всех ваших интеграционных тестов. Это также ускоряет ваши тесты.

Одна из приятных особенностей mocha заключается в том, что он включает в себя корневой набор до и после, что полезно именно для таких вещей. См. https://stackoverflow.com/a/18802494/1935918.

person Dan Kohn    schedule 23.04.2014
comment
Интересно, что я переключился на мокко из-за функции после... но это тоже не выключило сервер. Итак, я попробовал супертест с мокко и, наконец, смог получить нужное поведение при тестировании. - person jvanstry; 24.04.2014