在Jest中用'new'关键字模拟外部服务

时间:2018-05-04 17:13:57

标签: javascript unit-testing jestjs

我无法正确模拟使用 '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') } }) }) } 关键字的模块,以便在我的jest测试中实际返回我想要的内容。

我的功能如下:

/* 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的CIImage函数,但是也无法正常工作。

任何人都能看到我做错了什么?

1 个答案:

答案 0 :(得分:1)

我认为你的mock方法需要调用传递给它们的回调。尝试:

mayfly.read = jest.fn((recordId, callback) => {
    callback(undefined, {
    status: 200
    })
})