【问题标题】:Wait for DB connection before running tests - event issue在运行测试之前等待数据库连接 - 事件问题
【发布时间】:2019-07-16 02:16:06
【问题描述】:

我正在尝试在我的 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”事件的方式的问题。我想知道如何正确处理这个问题。

【问题讨论】:

标签: javascript node.js express mocha.js


【解决方案1】:

这可能是一种竞争条件 - 数据库可能在测试开始之前就已连接。在这种情况下,您将永远不会收到该事件,因为它已经触发了。

我会检查数据库是否已连接,只有在未连接时,我才会等待“dbConnect”事件。类似的东西

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 2013-04-25
    • 2014-10-21
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    相关资源
    最近更新 更多