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

Unit testing Express / Loopback middleware without starting a server

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

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

您可以使用 supertest 模块。

You may pass an http.Server, or a Function to request() - if the server is not already listening for connections then it is bound to an ephemeral port for you so there is no need to keep track of ports.

摩卡

mocha 示例

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);
  });
});

艾娃

此外,您可能对 ava 测试 运行ner 而不是 mocha 感兴趣。

主要原因process isolation between test files

这通常是我使用 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();
      });
  });
});

serial 标识符告诉 ava 串行地 运行 it 子句。否则它将 运行 所有文件的所有测试并行进行。

由于进程隔离,每个测试文件都有自己的、隔离的环回实例(和一般的节点环境),所有测试文件都可以 运行 并行,这也加快了测试速度。然而,在每个测试文件中,使用 serial,测试将 运行 一个接一个,按照它们在文件中的写入顺序。