【问题标题】:Catch on JS Promise being called but not calling other jest mocked object赶上 JS Promise 被调用但不调用其他开玩笑的模拟对象
【发布时间】:2018-11-10 17:23:46
【问题描述】:

我有一个简单的 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,我可以看到记录器被调用,但它被调用了两次。我想我错过了一些简单的东西。谁能指出我正确的方向?

【问题讨论】:

    标签: javascript asynchronous promise mocking jestjs


    【解决方案1】:

    哇!因此,当我认为它不起作用时,我误解了返回的信息。添加 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')
      })
    })
    

    【讨论】:

      猜你喜欢
      • 2018-12-27
      • 2018-07-30
      • 2019-10-27
      • 2018-05-05
      • 2021-07-03
      • 1970-01-01
      • 2021-07-30
      • 2020-03-15
      • 1970-01-01
      相关资源
      最近更新 更多