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

标签 javascript unit-testing jestjs

我无法正确模拟使用 new 关键字实际返回我在 Jest 测试中想要的内容的模块。

我的函数是这样的:

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

按原样进行测试,出现以下错误: 超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调。

但是,如果我删除 jest.mock('mayfly'),然后我到达我的 yo dog 控制台日志,并且出现连接错误。这告诉我,我一定是在模拟第三方模块 mayfly 的方式上做错了。通常,这很容易,但这是我第一次不得不模拟一个必须使用 new 关键字的模块。

您会注意到注释掉了,我已经尝试使用 jest 的 mockImplementation() 函数,但也无法正常工作。

有人看到我做错了什么吗?

最佳答案

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

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

关于javascript - 在 Jest 中使用 'new' 关键字模拟外部服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50180062/

相关文章:

java - 如何防止 spring boot 在启动时自动创建 bean 'entityManagerFactory' 实例?

reactjs - 符号不是函数 react enzyme i18n 错误

reactjs - 如何使用 Jest 使用新的 React Router Hooks 模拟历史记录。

javascript - 控制台登录 WordPress 站点时出现 JS 错误,但 html 站点中却没有

c# - 最小起订量和 "as"关键字

javascript - 在 Angular 4 中提交表单之前输入字段验证

javascript - 如何在使用 firebase 的 react native 中进行单元测试?

javascript - 在 Jest (Node.js) 中测试单例的静态方法

javascript - Vue - 在方法中过滤数组时传递过滤条件

javascript - 有没有办法在不访问后端的情况下处理 CORS?