首页 > 解决方案 > 带有 jest 的模拟函数,其中包含一个回调作为参数,该参数返回一个承诺

问题描述

我正在与第 3 方脚本集成,并且遇到了一个我不知道如何正确测试的场景。

第 3 方脚本使用一些方法将对象添加到窗口。create 方法的第二个参数是一个回调函数,它返回一个被拒绝或解决的承诺。

我需要能够使用拒绝或已解决状态模拟第二个参数,以便我的单元测试可以涵盖 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)
  })
})

以下是我当前尝试模拟不起作用的函数(针对窗口对象)。它没有正确设置拒绝值或解析值:(

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

Any help would be greatly appreciated

标签: javascriptreactjsunit-testingjestjs

解决方案


create is callback-based and is unaware of promises, so a mock shouldn't involve promises either.

Given that thirdpartyform.create is a spy that has been previously set up with jest.mock, jest.spyOn, etc, a mock for successful response:

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

A mock for unsuccessful response:

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

推荐阅读