Перемешивание внешнего сервиса с новым ключевым словом в Jest - PullRequest
0 голосов
/ 04 мая 2018

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

Моя функция выглядит так:

 'myService.js'

export const checkMayFlyRecord = record => {
  return new Promise((resolve, reject) => {
    const recId = crypto.createHash('md5').update(record.id + record.url).digest('hex')

    const mayflyClient = new mayfly({
      appName: 'cartrecoverynodeserv',
      lifetime: 24 * 3600, // store for 24 hours
      crypto: false
    })

    mayflyClient.read(recId, (err, response) => {
      console.log('yo dog')
      if (err) {
        reject(err)
      } else if (response.status && response.status > 0) {
        mayflyClient.set(recId, JSON.stringify(record), (err, response) => {
          if (err) {
            reject(err)
          } else if (response.status && response.status > 0) {
            reject(err)
          }
          resolve('saved')
        })
      } else {
        resolve('found')
      }
    })
  })
}

И мой тест выглядит так:

/* global jest, describe, beforeAll, beforeEach, expect, test */

describe('myService', () => {
  let mayfly
  let dropoffsService
  let mayflyFunctions
  const records = [
    {'id': '2024876599037241006', 'url': 'jey.com'}
  ]

  beforeAll(() => {
    mayfly = jest.genMockFromModule('mayfly')
    jest.mock('mayfly')
    mayfly = require('mayfly')

    mayfly.read = jest.fn().mockReturnValue({ status: 1 })
    mayfly.set = jest.fn().mockReturnValue({ status: 1 })

    // mayflyFunctions = {
    //   set: jest.fn().mockReturnValue({ status: 1 }),
    //   read: jest.fn().mockReturnValue({ status: 1 })
    // }
    //
    // mayfly.mockImplementation(() => { mayflyFunctions })

    myService = require('./myService')
  })

  describe('checkMayFlyRecord', () => {
    test.only('mayfly calls the read function when connection is made', async () => {
      await myService.checkMayFlyRecord(records[0])
      expect(mayflyFunctions.read).toHaveBeenCalled()
    })
  })
})

С тестом как есть я получаю следующую ошибку: Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.

Тем не менее, если я удаляю jest.mock('mayfly'), то достигаю своего журнала консоли yo dog и получаю ошибку соединения. Это говорит мне, что я, должно быть, делаю что-то не так с тем, как я издеваюсь над сторонним модулем mayfly. Как правило, это легко, но это первый раз, когда мне нужно было смоделировать модуль, где я должен использовать ключевое слово new.

Вы заметите, что закомментировано, я уже пытался использовать функцию mockImplementation() jest, но не смог заставить это работать.

Кто-нибудь видит, что я делаю не так?

1 Ответ

0 голосов
/ 04 мая 2018

Я думаю, что ваши фиктивные методы должны вызывать обратные вызовы, переданные им. Попробуйте:

mayfly.read = jest.fn((recordId, callback) => {
    callback(undefined, {
    status: 200
    })
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...