javascript - 在运行测试之前等待数据库连接 - 事件问题
问题描述
我正在尝试在我的快递应用程序中测试路线。App.js 是一个子应用程序,当它运行时它会等待数据库连接,然后根据结果挂载路由。
应用程序.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...
问题是 'dbConnected' 事件并不总是被 app.test.js 中的事件处理程序捕获,并且我收到ELIFECYCLE错误。
1)“首先”挂钩:错误:超过 2000 毫秒的超时。对于异步测试和钩子,确保调用了“done()”;如果返回 Promise,请确保它已解决。
测试有时运行正确,因此我假设这是我如何处理“dbConnected”事件的问题。我想知道如何正确处理这个问题。
解决方案
这可能是一种竞争条件 - 数据库可能在测试开始之前就已连接。在这种情况下,您将永远不会收到该事件,因为它已经被触发了。
我会检查数据库是否已连接,只有在未连接时,我才会等待“dbConnect”事件。就像是
before(function (done) {
if (app.isDbConnected) { // set app.isDbConnected when connected.
process.nextTick(done)
} else {
app.on('dbConnected', () => done());
}
});
推荐阅读
- dictionary - python字典中特定值的计数
- java - 如何在用户名和文章之间添加一行或一些分隔符
- mysql - 统计唯一用户的 SQL 最短查询
- sql - 基于等级和可用小时级联工作量的SQL方法
- python - 如何使用 strftime 获取一天的日期范围?
- r - 在每次迭代中创建一个新列
- google-api - 谷歌云端硬盘嵌入问题
- ios - 重装后才更新 Flutter 应用的 TestFlight 更新
- reactjs - 测试是否在钩子中调用了窗口函数
- sql - 无法转换为 java.math.BigInteger java.lang.ClassCastException