在 Jest 中,beforeAll()
应该在 beforeEach()
之前运行。
问题是,当我为 beforeAll()
使用异步回调时,Jest 在继续执行 beforeEach()
之前不等待回调完成。
如何强制 Jest 等待异步的 beforeAll()
回调完成后再执行 beforeEach()
?
最小可重现示例
tests/myTest.test.js
const connectToMongo = require('../my_async_callback')
// This uses an async callback.
beforeAll(connectToMongo)
// This is entered before the beforeAll block finishes. =,(
beforeEach(() => {
console.log('entered body of beforeEach')
})
test('t1'), () => {
expect(1).toBe(1)
}
test('t2'), () => {
expect(2+2).toBe(4)
}
test('t3'), () => {
expect(3+3+3).toBe(9)
}
我的异步回调函数.js
const connectToMongo = async () => {
try {
await mongoose.connect(config.MONGODB_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false,
useCreateIndex: true
})
console.log('Connected to MongoDB')
} catch (err) {
console.log(`Error connecting to MongoDB: ${err.message}`)
}
}
module.exports = connectToMongo
更新:正如被接受的回答所指出的那样,Jest实际上会等待beforeAll
先完成,除非存在损坏的Promise链或超时的情况。 因此,我的问题前提是错误的。 我的connectToMongo
函数正在超时,简单地增加Jest的超时时间就解决了这个问题。
catch(err)
是一个错误,因为它会抑制错误(尽管这不会阻止beforeAll继续进行)。 - Estus FlaskbeforeAll
和beforeEach
时,DB请求超时,尽管其他方面工作正常。也就是说,在beforeEach
中连接时(虽然很丑),或者完全省略Jest时,它们可以工作。如果不是Mongoose执行顺序相关,那么是什么原因导致了这种行为呢? - Askercatch
,或者至少重新抛出一个错误。我期望它可以在beforeAll中不使用async..await工作,但我无法确认这一点。无论如何,对于这样的顺序,您可能希望在beforeEach上自定义包装器,例如:let mongoProm; let beforeEachMongo = async (cb) => { mongoProm = mongoProm || mongoose.connection(...); await mongoProm; return cb() }
。 - Estus Flask