You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Axios带回调的API调用测试问题求助

解决回调式API调用的Jest测试问题

你的测试无法正常执行,核心原因是异步回调的测试逻辑未正确处理,Jest默认同步结束测试流程,不会等待回调函数执行;同时代码里还有几处语法/拼写错误需要修正,以下是具体解决步骤:

1. 修复测试用例的基础语法错误

测试用例的定义必须用it而非if,这是Jest的标准语法:

// 错误写法
if('Should add user', () => { ... })

// 正确写法
it('Should add user', () => { ... })

2. 处理异步回调的测试逻辑

因为addUser是基于回调的异步操作,需要明确告诉Jest等待回调执行完成再结束测试,有两种常用方案:

方案一:使用done回调

通过Jest提供的done参数,在回调执行完成后通知测试结束:

jest.mock('axios')

it('Should add user', (done) => {
    const params = {
        name: 'jack lee',
        email: 'jacktest111@gmail.com',
        phone: '09909909090'
    }
    const mockResponse = { success: true }
    axios.post.mockResolvedValue(mockResponse)

    UserService.addUser(
        params,
        (response) => {
            expect(response.success).toBe(true)
            done() // 调用done告知Jest测试完成
        },
        (error) => {
            done(error) // 若进入失败回调,传递错误信息终止测试
        }
    )

    expect(axios.post).toHaveBeenCalledTimes(1) // 注意是CalledTimes,不是CalledTime
})

方案二:封装Promise版本简化测试(可选优化)

如果不想长期处理回调逻辑,可以给addUser封装一个Promise版本,让测试用async/await更简洁:

// UserService.js 新增Promise封装方法
addUserPromise(params) {
    return new Promise((resolve, reject) => {
        this.addUser(params, resolve, reject)
    })
}

// 测试用例
it('Should add user', async () => {
    const params = {
        name: 'jack lee',
        email: 'jacktest111@gmail.com',
        phone: '09909909090'
    }
    const mockResponse = { success: true }
    axios.post.mockResolvedValue(mockResponse)

    const response = await UserService.addUserPromise(params)
    expect(response.success).toBe(true)
    expect(axios.post).toHaveBeenCalledTimes(1)
})

3. 修复UserService的参数拼写错误

你的addUser方法第一个参数写为paras,但内部调用axios.post时用的是params,这会导致请求参数未正确传递,修正:

// UserService.js
addUser(params, successCallback, failureCallback) { // 将paras改为params
    axios.post(URL, params, config)
    .then((response) => {
        successCallback(response)
    })
    .catch((error) => {
        failureCallback(error)
    })
}

4. 补充失败回调的传递

测试时务必传递failureCallback,避免因参数缺失导致运行报错,即使不测试失败场景,也可以传入空函数或Mock函数。

内容的提问来源于stack exchange,提问作者Jack Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:22:48