Javascript 捕获正在调用但未调用其他jest Mock对象的JS Promise
我有一个简单的js函数,它试图通过一个Promise连接到mongodb,但要么成功,要么失败Javascript 捕获正在调用但未调用其他jest Mock对象的JS Promise,javascript,asynchronous,promise,mocking,jestjs,Javascript,Asynchronous,Promise,Mocking,Jestjs,我有一个简单的js函数,它试图通过一个Promise连接到mongodb,但要么成功,要么失败 const MongodbService = () => { mongoose.connect(mongodbUrl, options).then(() => { logger.info('Mongodb Connected', { url: process.env.MONGODB_URL }) }).catch(err => { logger.error('
const MongodbService = () => {
mongoose.connect(mongodbUrl, options).then(() => {
logger.info('Mongodb Connected', { url: process.env.MONGODB_URL })
}).catch(err => {
logger.error('Mongodb: ${err}', { url: process.env.MONGODB_URL })
})
return mongoose
}
我想简单地测试一下。我嘲笑记录器:
import logger from '../../../config/winston'
jest.mock('../../../config/winston')
我有测试成功的规范,它按预期工作:
it('it should handle a connection success', async () => {
mongoose.connect = jest.fn(() => Promise.resolve())
await MongodbService()
expect(logger.info.mock.calls[0][0]).toEqual('Mongodb Connected')
expect(logger.info.mock.calls[0][1]).toEqual({ url: 'mongodb://mongodb/jb-dev' })
})
我有另一个检查失败的方法,这就是我被卡住的地方:
it('it should handle a connection failure', async () => {
mongoose.connect = jest.fn(() => Promise.reject(new Error('boom')))
await MongodbService()
expect(logger.error.mock.calls[0][0]).toEqual('Mongodb Error: boom')
})
这是由于未能说明未调用记录器,即使在我将console.log放入函数时,我可以看到它已正确调用。如果我在expect周围添加一个setTimeout,那么我可以看到正在调用记录器,但它已经被调用了两次。我想我错过了一些简单的事情。有人能给我指一下正确的方向吗?Doh!因此,当我认为返回的信息不起作用时,我无法理解它。添加nextTick对我来说效果很好:
it('it should handle a connection failure', async () => {
mongoose.connect = jest.fn(() => Promise.reject(new Error('bang')))
await MongodbService()
process.nextTick(() => {
expect(logger.error.mock.calls[0][0]).toEqual('Mongodb: Error: bang')
})
})