Jestjs - 在 beforeEach 块中创建的数据库连接在测试块中变为未定义
Jestjs - database connection created in beforeEach block becomes undefined in test block
我已经设置了我的项目,以便在建立数据库连接后发出一个事件。应用程序在此之后启动。
单元测试时我设置了一个局部变量,在内部创建数据库连接beforeEach
并将连接保存到局部变量。
在这个 beforeEach
块中,我可以看到数据库已连接。但是,如果我在 test
块内部检查局部变量 returns 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
立即挂钩回调 returns,尽管它是 async
。您需要从中显式 return 一个 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
})
})
只是为了让我的评论更清楚一点,以下代码有效;
beforeEach(async (done) => {
connectToDatabase(mediator);
mediator.on('db.ready', (db: Connection) => {
dbConnection = db;
done();
});
});
我已经设置了我的项目,以便在建立数据库连接后发出一个事件。应用程序在此之后启动。
单元测试时我设置了一个局部变量,在内部创建数据库连接beforeEach
并将连接保存到局部变量。
在这个 beforeEach
块中,我可以看到数据库已连接。但是,如果我在 test
块内部检查局部变量 returns 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
立即挂钩回调 returns,尽管它是 async
。您需要从中显式 return 一个 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
})
})
只是为了让我的评论更清楚一点,以下代码有效;
beforeEach(async (done) => {
connectToDatabase(mediator);
mediator.on('db.ready', (db: Connection) => {
dbConnection = db;
done();
});
});