赶上JS Promise被调用但不调用其他开玩笑的模拟对象

时间:2018-07-03 08:02:21

标签: 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('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放在函数中也可以正确调用它。如果我在期望值附近添加setTimeout,则可以看到记录器正在被调用,但是它被调用了两次。我想我缺少一些简单的东西。谁能指出我正确的方向?

1 个答案:

答案 0 :(得分:0)

Do!因此,我很想不到我以为它不起作用时返回的信息。添加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')
  })
})