在 express 服务器启动之前阻止 运行 的超级测试

Prevent supertest from running until express server has started

我有一个使用 yoman 全栈生成器生成的节点/快速 js 应用程序。我已经将 mongo / mongoose 换成 cloudant db(这只是 couchdb 的付费版本)。我为 Cloudant node.js 库编写了一个包装器,它通过包装在承诺中的 init() 方法处理我的实例的 cookie 身份验证。我已经重构了我的应用程序,以便在根据下面摘自我的 app.js

的代码段建立与数据库的连接之前不启动快速服务器
myDb.init(config).then(function (db) {
  logger.write(1001, '','Connection to Cloudant Established');
  // Start server
  server.listen(config.port, config.ip, function () {
    logger.write(1001, "",'Express server listening on '+config.port+', in '+app.get('env')+' mode');
  });
});

在我的快速路线上,我引入了一个新的中间件,它将 db 对象附加到请求中,以便在整个中间件链中使用,如下所示。这在设置要使用的两个集合之前获取数据库连接对象。

exports.beforeAll = function (req, res, next) {
  req.my = {};

  // Adding my-db
  req.my.db = {};
  req.my.db.connection = myDb.getDbConnection();
  req.my.db.orders = req.my.db.connection.use(dbOrders);
  req.my.db.dbRefData = req.my.db.connection.use(dbRefData);
  next();
};

当我通过 POSTman 手动驱动我的 api 时,此机制有效,因为在数据库连接的承诺得到解决之前,快速服务器不会启动。但是,当 运行 我的自动化测试时,前几个测试现在总是失败,因为在 jasmine 开始 运行 我针对 API 的测试之前,应用程序尚未完成数据库初始化。我可以在我的日志中看到请求通过,并且在中间件中 myDb.getDbConnection(); 返回 undefined。我正在使用 supertest 和 node-jasmine 来 运行 我的测试。例如

'use strict';

var app = require('../../app');
var request = require('supertest');

describe('GET /api/content', function () {

  it('should respond with JSON object', function (done) {
    request(app)
      .get('/api/content')
      .expect(200)
      .expect('Content-Type', /json/)
      .end(function (err, res) {
        if (err) return done(err);
        expect(res.body).toEqual(jasmine.any(Object));
        done();
      });
  });
});

所以,我的问题是如何防止 supertest 在 server.listen() 步骤因 myDb.init() 调用被解析而完成之前发出请求?或者也许有某种茉莉花 beforeAll 我可以用来阻止它 运行描述直到承诺得到解决?

你可以让你 app return 一个 EventEmitter,它在完成初始化后发出 "ready" 事件。

然后您的测试代码,在 before 子句中,可以等到 "ready" 事件从应用程序到达,然后再继续测试。