Поймать на вызове JS Promise, но не вызывать другой шутливый объект - PullRequest
0 голосов
/ 03 июля 2018

У меня есть простая функция js, которая пытается подключиться к mongodb через Promise, и любой из них завершается неудачно.

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 голосов
/ 03 июля 2018

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