react-redux - 如何使用 Jest 测试调度的反应函数
问题描述
我正在尝试对使用 Axios 助手实例进行异步调用的函数进行单元测试。我尝试了多种方法来尝试对此进行单元测试,但我似乎无法在网上找到任何有帮助的材料。我已经被这个问题困住了几天,这令人沮丧,所以任何帮助将不胜感激!下面是 Axios Helper 文件 (api.js)
api.js
import axios from 'axios'
const API = (token = null) => {
let headers = {
'Content-Type': 'application/json',
'Ocp-Apim-Subscription-key': process.env.NEXT_PUBLIC_API_HEADER_SUBSCRIPTION_KEY
}
if (token) {
const tokenHeader = { Authorization: 'Bearer ' + token }
headers = { ...headers, ...tokenHeader }
}
const url = process.env.NEXT_PUBLIC_API_BASE_URL
const API = axios.create({
baseURL: url,
headers
})
return API
}
export default API
模拟 API
export default {
post: jest.fn(() =>
Promise.resolve({
data: {}
})
),
get: jest.fn(() =>
Promise.resolve({
data: {}
})
)
}
动作文件
export const initiate2FA = (destinationValue) => async () => {
const twoFactorAuth = destinationValue
const res = await API().post('/foo', {
Destination: twoFactorAuth
})
return res
}
Action.test.js
import API from 'api/api'
import { initiate2FA } from 'actions/userActions'
jest.mock('api/api')
const mockedAxios = API
const dispatch = jest.fn()
describe('Initiate2FA function', () => {
it('bar', async () => {
mockedAxios.get.mockImplementationOnce(() => Promise.resolve({ status: 200 }))
const t = await dispatch(initiate2FA('test@test.com'))
console.log(t)
})
})
我对上述测试文件的问题是它返回一个匿名函数,我不知道如何处理它以通过单元测试。测试的目标是确保调用该函数。我不确定我是否以正确的方式接近这个或应该改变我的方法。
同样,任何建议都会很棒!
解决方案
模拟 API 调用是你可以在你自己的 React 组件上模拟的东西,而不是一个函数,最好的选择是不在你的组件上模拟任何东西。在这里您可以阅读所有关于为什么不应该模拟您的 API 函数的信息。在本文的最后,您将找到一个名为Mock Service Worker的库,您可以将其用于您的目的。
你声明你有一个需要模拟的实际 HTTP 调用的方式是这样的:
rest.get('/foo', async (req, res, ctx) => {
const mockedResponse = {bar: ''};
return res(ctx.json(mockedResponse))
}),
如果你只是需要对一个函数进行单元测试,你仍然可以使用 Mock Service Worker 来解析 HTTP 请求,然后测试之后会发生什么。这仍然是您的首选。测试看起来像:
// this could be in another file or on top of your tests.
rest.get('/foo', async (req, res, ctx) => {
const mockedResponse = {bar: ''};
return res(ctx.json(mockedResponse))
}),
// and this would be your test
describe('Initiate2FA function', () => {
it('bar', async () => {
const res = await initiate2FA('test@test.com');
expect(res).toBe({bar: '');
})
})
推荐阅读
- ios - ios - 在领域迁移中创建关系
- regex - 在 Perl 中使用 Regexp 提取两个字符串之间的字符串
- vba - 如何将数据发送到第二个屏幕?
- sitecore - Sitecore 项目 DisplayName 有效用作页面标题
- java - Android Redmi 6A 问题 - 连接服务器失败由事件 BOOT_COMPLETED 触发
- python - 从列表创建嵌套树
- java - Java Apache Poi 编写 Excel
- python - 无法更改 Tkinter 中按钮的颜色
- python - 如何用 Python 制作空间三角形
- matlab - 在Matlab中通过递归查找数字中数字的出现