Javascript 捕获正在调用但未调用其他jest Mock对象的JS Promise

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('

我有一个简单的js函数,它试图通过一个Promise连接到mongodb,但要么成功,要么失败

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')
  })
})