运行jasmine规范后关闭快速服务器

时间:2014-04-22 21:07:51

标签: node.js express jasmine-node

我正在尝试设置我的快速服务器的茉莉花测试。我正在使用每个规范启动一个新服务器,并在每个规范完成后尝试将其关闭。不幸的是,服务器似乎没有关闭......使得不可能运行多个规范。

server.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();
      });
    });
  });
});

第一个规范按预期传递,但终端从未完成测试(即:服务器仍在运行),并且任何后续测试都会导致" ECONNREFUSED"被抛出。

2 个答案:

答案 0 :(得分:2)

您可以使用npm模块server-destroy。 server-destroy跟踪所有连接,然后在调用destroy时关闭它们。此外,destroy方法需要回调,因此您应该通过" done"函数到你的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函数传递给close函数server.close(done),如本文How to correctly unit test Express server中所述

答案 1 :(得分:1)

我从未能够以编程方式可靠地关闭Express。相反,我建议使用jasmine-before-all之类的东西为所有集成测试启动服务器一次。这也加快了你的测试速度。

关于mocha的一个好处是它包含一个前后的根套件,这对于这种事情很有用。见https://stackoverflow.com/a/18802494/1935918