等待数据库连接,然后再运行测试-事件问题

时间:2018-07-16 12:27:53

标签: javascript node.js express mocha

我正在尝试在我的Express应用中测试路线。 App.js是一个子应用程序,运行时会等待数据库连接,然后根据结果挂载路由。

app.js

db.connect() // returns a promise
.then(dbConnection => {
  app.use(routes(dbConnection));
  app.emit('dbConnected'); // DB Connected
}).catch(error => {
  // if db connection fails - return 503 for every request
  console.log(`DB connection failed.`);
  app.use((req, res, next) => {
    const error = new Error('Service unavailable');
    error.statusCode = 503;
    error.name = err.name;
    next(error)
  });  
});

module.exports = app;

我已经编写了 app.test.js 来测试路由。我希望测试等待连接建立(因为只有在安装路由之后)。

app.test.js

before(function (done) {
  app.on('dbConnected', () => done());
});
// tests go here...

问题是 app.test.js 中的事件处理程序并不总是捕获'dbConnected'事件,并且出现 ELIFECYCLE 错误。

  

1)“首先”挂钩:        错误:超时超过2000毫秒。对于异步测试和挂钩,请确保调用了“ done()”;如果返回了Promise,请确保它可以解决。

测试有时可以正确运行,因此我假设这与我处理'dbConnected'事件有关。我想知道如何正确解决这个问题。

1 个答案:

答案 0 :(得分:0)

这可能是竞争条件-测试开始之前DB已连接。在这种情况下,您将永远无法获得平衡,因为它已经被解雇了。

我将检查数据库是否已连接,只有在没有连接的情况下,我才会等待'dbConnect'事件。像

before(function (done) {
  if (app.isDbConnected) { // set app.isDbConnected when connected.
    process.nextTick(done)
  } else {
    app.on('dbConnected', () => done());
  }
});