带有笑话的模拟功能,其中包含回调作为参数,并返回承诺

时间:2020-09-28 09:37:41

标签: javascript reactjs unit-testing jestjs

我正在与第三方脚本集成,并且遇到了一种我不知道如何正确测试的方案。

第三方脚本通过一些方法将对象添加到窗口。 create方法的第二个参数是一个回调函数,该函数返回被拒绝或解决的Promise。

我需要能够以拒绝状态或已解决状态来模拟第二个参数,以便我的单元测试可以涵盖是否用错误或成功消息来更新UI。

如何模拟具有适当响应的此函数和回调函数?

thirdpartyform.create(options, (err, message) => {
  return new Promise((resolve, reject) => {
    if (err) {
      reject(err.reason)
    } else {
      resolve(message)
    }
  })
  .then(message => {
    setState(message)
  })
  .catch((err) => {
    setState(err)
  })
})

下面是我目前试图模拟不起作用的功能(针对window对象)。它没有正确设置拒绝值或解析值:(

create: jest.fn((options, callback) => callback(jest.fn().mockRejectedValue(FORM_TIMEOUT)))

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

create是基于回调的,并且没有意识到诺言,因此模拟也不应该涉及诺言。

考虑到thirdpartyform.create是先前使用jest.mockjest.spyOn等设置的间谍,是成功响应的模拟:

thirdpartyform.create.mockImplementation((options, cb) => cb(null, 'message'))

响应失败的模拟:

thirdpartyform.create.mockImplementation((options, cb) => cb({ reason: 'error' }))