У меня возникли проблемы с правильным издевательством над модулем, который использует ключевое слово 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, но не смог заставить это работать.
Кто-нибудь видит, что я делаю не так?