我已经设置了我的项目,一旦建立了数据库连接,就会发出一个事件。在此之后,应用程序将启动。
在进行单元测试时,我设置了一个局部变量,在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
块之外。
发布于 2018-08-15 00:31:55
虽然是async
,但beforeEach
钩子回调会立即返回。您需要显式地从它返回一个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
})
})
发布于 2018-08-15 05:15:35
只是为了让我的评论更清晰一点,下面的代码是有效的;
beforeEach(async (done) => {
connectToDatabase(mediator);
mediator.on('db.ready', (db: Connection) => {
dbConnection = db;
done();
});
});
https://stackoverflow.com/questions/51845364
复制相似问题