在不启动服务器的情况下对Express / Loopback中间件进行单元测试

Ale*_*lls 5 node.js express loopbackjs

有没有一种方法可以在不实际创建服务器和侦听端口的情况下对Express / Loopback中间件进行单元测试?

我的问题是在我的测试代码中创建多个服务器会引入端口冲突的问题。

Ove*_*ivr 5

您可以使用超级测试模块。

您可以将http.Server或Function传递给request()-如果服务器尚未在侦听连接,则它已为您绑定到临时端口,因此无需跟踪端口。

摩卡咖啡

摩卡咖啡的例子

var request = require('supertest');
var app = require('path/to/server.js');

describe('GET /user', function() {
  it('respond with json', function(done) {
    request(app)
      .get('/user')
      .set('Accept', 'application/json')
      .expect('Content-Type', /json/)
      .expect(200, done);
  });
});
Run Code Online (Sandbox Code Playgroud)

阿瓦

另外,您可能对ava测试运行程序感兴趣,而不是对mocha 感兴趣。

主要原因测试文件之间的进程隔离

这通常是我的带有ava的测试文件模板

var describe = require('ava-spec').describe;
var app = require('path/to/server.js');
var request = require('supertest');

describe("REST API", function(it){
  it.before.cb(function(t){
    request(app)
      .post('/api/Clients/')
      .send({
        "username": "foo",
        "password": "bar"
      })
      .expect(200, function(err, res){
          t.end(err);
      });
  });

  it.serial.cb('Does something',
  function(t){
    request(app)
      .get(//..)
      .expect(404, function(err, res){
        if (err) return t.end(err);
        t.end();
      });
  });
  it.serial.cb('Does something else afterward',
  function(t){
    request(app)
      .get(//..)
      .expect(401, function(err, res){
        if (err) return t.end(err);
        t.end();
      });
  });
});
Run Code Online (Sandbox Code Playgroud)

serial标识告诉AVA运行it串行条款。否则,它将并行运行所有文件中的所有测试。

由于进程隔离,每个测试文件都有自己的隔离回送实例(通常是节点环境),并且所有测试文件都可以并行运行,从而也加快了测试速度。但是,在每个测试文件中,使用serial,测试将按照写入文件的顺序依次运行。