node.js - Jestjs - 在 beforeEach 块中创建的数据库连接在测试块中变得未定义
问题描述
我已经设置了我的项目,以便一旦建立数据库连接就会发出一个事件。该应用程序在此之后启动。
单元测试时,我设置了一个局部变量,在内部创建数据库连接beforeEach
并将连接保存到局部变量。
在这个beforeEach
块中,我可以看到数据库已连接。但是,如果我在test
块内检查,则局部变量返回undefined
. 什么是正确的方法?
- db.config.ts -
export async function connectToDatabase(mediator: EventEmitter) {
const connectionOptions = await getConnectionOptions();
const dbConnection = await createConnection(connectionOptions);
mediator.emit('db.ready', dbConnection);
}
- index.ts -
const mediator = new EventEmitter();
connectToDatabase(mediator);
mediator.on('db.ready', (db: Connection) => {
app.listen(3000);
console.log('app started');
});
测试
describe('Jest Tests', () => {
const mediator = new EventEmitter();
let dbConnection: Connection;
beforeEach(async () => {
connectToDatabase(mediator);
mediator.on('db.ready', (db: Connection) => {
dbConnection = db;
console.log(dbConnection.isConnected); // **returns TRUE**
}
}
test('Testing db connection', () => {
console.log(dbConnection.isConnected); // **dbConnection undefined**
}
}
我还尝试将局部变量放在describe
块之外。
解决方案
beforeEach
钩子回调立即返回,虽然它是async
. 您需要从中显式返回一个 Promise,并仅在db.ready
事件发出时履行它(或在某个超时时拒绝它)。
在伪代码中,它应该如下所示:
beforeEach(async () => {
return new Promise(async (fulfill, reject) => {
await connectToDatabase(mediator);
mediator.on('db.ready', db => {
dbConnection = db;
fulfill();
})
// reject on timeout
})
})
推荐阅读
- swift - 快速日期格式
- spring - 发送状态 200 无需等待任何返回
- php - PHP 和使用 strcmp 函数的正确方法
- vue.js - Vue计算属性未更新
- javascript - Get as Image 生成错误的图像 - Google App Script
- javascript - 调整大小和滚动问题 (JS/HTML)
- python - 在 Pytorch 中将 loss 乘以 n 后,多次 loss.backward() 和 loss.backward() 之间有区别吗?
- angular - 在角材料表上绑定枚举值
- c# - MVVM 如何将数据绑定到多个实例控件
- javascript - 使用javascript生成具有特定时间范围的随机模拟数据