Loopback和mocha:等待服务器完成启动脚本

时间:2016-07-11 18:01:47

标签: javascript node.js loopbackjs strongloop

关于问题标题,我想知道如何在启动测试之前检查环回启动脚本是否已完成。 在示例项目中:

https://github.com/strongloop/loopback-example-relations

测试文件夹中有file似乎可以完成这项工作,但遗憾的是它无法解决问题。

start-server.js:

var app = require('../server/server');

module.exports = function(done) {
  if (app.loaded) {
    app.once('started', done);
    app.start();
  } else {
    app.once('loaded', function() {
      app.once('started', done);
      app.start();
    });
  }
};

此脚本加载在rest test api中,如下所示:

before(function(done) {
    require('./start-server');
    done();
});

但永远不会调用该函数。这是使用该脚本的正确方法吗?

我结束了以下实施:

before(function (done) {
    if (app.booting) {
        console.log('Waiting for app boot...');
        app.on('booted', done);
    } else {
        done();
    }
});

有效,但我对这个启动服务器脚本感到困惑。

修改 在@stalin建议之后,我修改了before函数,如下所示:

before(function(done) {
    require('./start-server')(done);
});

并且执行进入else分支,但永远不会调用done

3 个答案:

答案 0 :(得分:4)

您永远不会将done函数传递给start-server脚本。尝试这样做:

before(function(done) {
    var server = require('./start-server');
    server(done);
});

答案 1 :(得分:1)

当引导脚本使用异步函数时(例如,自动迁移模型架构),它可能不起作用。应用程序将设置booting = false并且不等待回调完成,直到您明确调用回调:

// boot script with extra callback param:
module.exports = function (app, cb) {
  var db = app.dataSources.db;

  // update all database models
  db.autoupdate(function (err) {
    if (err) throw err;
    cb();
  });
};

答案 2 :(得分:1)

我只想指出Loopback小组的做法

https://github.com/strongloop/loopback/blob/44951a1032d2115a20a098fbeea767e0a5cd72c1/test/helpers/loopback-testing-helper.js#L39

beforeEach(function(done) {
    this.app = app;
    var _request = this.request = request(app);
    this.post = _request.post;
    this.get = _request.get;
    this.put = _request.put;
    this.del = _request.del;
    this.patch = _request.patch;

    if (app.booting) {
      return app.once('booted', done);
    }
done();

然后您会发现他们在每次集成测试中都在称呼它

https://github.com/strongloop/loopback/blob/b77907ffa59c7031fcb3bb6dbff96894bc597ba4/test/user.integration.js#L16

describe('access control - integration', function() {
  lt.beforeEach.withApp(app);