gpt4 book ai didi

javascript - 在 React 模块中测试 SweetAlert2 的 preConfirm Hook

转载 作者:行者123 更新时间:2023-11-30 19:11:32 26 4
gpt4 key购买 nike

具有这样的 React 模块名称 Modal:

import withReactContent from 'sweetalert2-react-content'

export const Modal = withReactContent(Swal)
const showModal = props => {
return Modal.fire({
...props,
showCloseButton: true
})
}

export default showModal

在另一个组件中用作用户操作的确认框

export const renderDeployModal = (deploymentId) => {
console.log(' - renderDeployModal - ')
Modal.fire({
type: 'question',
text: `Are you sure you wish to re-deploy this (${deploymentId})?`,
showCancelButton: true,
confirmButtonText: 'Deploy',
preConfirm: () => {
console.log(' - preConfirm - ')
return apiRequest(`/deployments/${deploymentId}/trigger`, {}, 'POST')
.then(response => {
return response.body
})
.catch(response => {
Modal.showValidationMessage(response.message)
})
},
allowOutsideClick: () => !Modal.isLoading()
}).then(result => {
if (result.value) {
notify('success', 'Your deployment has triggered.')
}
})
}

实现有效,但我遇到的问题是测试在 preConfirm Hook 中执行的逻辑,因为我想不出任何方法来触发 Modal.clickConfirm() 在我的测试中手动进行并实际工作

import * as mockModal from '../../modal'
jest.mock('../../modal')

describe('renderDeployModal', () => {

it('fails to run a deploy without deploymentId argument', async () => {
const Modal = mockModal.Modal.mockImplementationOnce()

Modal.fire.mockImplementationOnce(() => Promise.resolve({ value: false }))
Modal.clickConfirm = jest.fn()

// Modal.clickConfirm.mockImplementation(() => Promise.resolve())
// const spy = jest.spyOn(mockModal.Modal, 'clickConfirm')

apiRequest.default = jest.fn().mockReturnValue(Promise.reject(new Error('foo')))
await renderDeployModal(null)
await Promise.resolve()

Modal.clickConfirm()
await Promise.resolve()

expect(Modal.fire).toHaveBeenCalled()
expect(Modal.clickConfirm).toHaveBeenCalled()
expect(apiRequest.default).toHaveBeenCalledWith(`/deployments/null/trigger`, {}, 'POST')
})

上面的测试在 apiRequest 的最后预期失败。

  console.log src/actions.js:111
- renderDeployModal -
FAIL src/actions.test.js
...
✕ fails to run a deploy without deploymentId argument (56ms)

● renderDeployModal › fails to run a deploy without deploymentId argument

expect(jest.fn()).toHaveBeenCalledWith(expected)

Expected mock function to have been called with:
["/deployments/null/trigger", {}, "POST"]
But it was not called.

148 | expect(Modal.fire).toHaveBeenCalled()
149 | expect(Modal.clickConfirm).toHaveBeenCalled()
> 150 | expect(apiRequest.default).toHaveBeenCalledWith(`/deployments/null/trigger`, {}, 'POST')
| ^

还有 console.log(' - renderDeployModal - ') 出现了,但是 console.log(' - preConfirm - ') 没有出现,表明 Modal.clickConfirm() 未正确触发。

我在这里错过了什么?我没有想法(好的或坏的)去尝试。

最佳答案

每当你模拟一个模块时

jest.mock('../../modal')

它在没有实现的情况下为模块对象对象的每个属性创建模拟函数。

所以您将一个对象传递给 Modal.fire(),它具有回调 preConfirm,但没有任何东西应该调用它。因此,您可能应该将模拟实现更改为类似以下内容:

Modal.fire.mockImplementationOnce(({ preConfirm }) => {
preConfirm(); // <- execute the given callback
return Promise.resolve({ value: false })
})

然后期待它被调用


旁注: 顺便说一下,

test('if I call a function it`s actually being called', () => {
Modal.clickConfirm() // <- execute a function within the test
expect(Modal.clickConfirm).toHaveBeenCalled() // and make sure it have been called few lines below
});

关于javascript - 在 React 模块中测试 SweetAlert2 的 preConfirm Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58409018/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com