Loopback and mocha: wait for server to finish boot scripts
You are never passing the done function to the start-server
script. Try to do this:
before(function(done) {
var server = require('./start-server');
server(done);
});
It might not work when your boot scripts are using asynchronous functions (for example to automigrate models schema). Application will set booting = false
and not wait for callbacks to finish until you invoke a callback explicitly:
// 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();
});
};
I just want to point out the way Loopback team did it
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();
Then you'd find that they're calling it pretty much within every integration test
https://github.com/strongloop/loopback/blob/b77907ffa59c7031fcb3bb6dbff96894bc597ba4/test/user.integration.js#L16
describe('access control - integration', function() {
lt.beforeEach.withApp(app);