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

测试自定义useUserSearch hook时无法mock useEffect内的userSearch函数,求解决方案

单元测试实现方案

针对你基于RTK Query生成的mutation hook mock需求,有两种常用实现方案:

方案1:直接Mock useUserSearchMutation钩子(单元测试首选)

该方案无需依赖Redux上下文,只验证自定义hook本身的逻辑,测试效率更高:

  1. 首先在测试文件顶部mock你导出useUserSearchMutation的API模块:
// 替换成你实际的API文件路径
jest.mock('./userSearchAPI', () => ({
  ...jest.requireActual('./userSearchAPI'),
  useUserSearchMutation: jest.fn()
}))
  1. 编写测试用例,构造mock的mutation触发函数:
import { useUserSearchMutation } from './userSearchAPI'

it('搜索字符长度大于3时正常返回用户列表', async () => {
  // 构造模拟返回数据
  const mockExpected = [{ id: 1, name: '张三' }, { id: 2, name: '李四' }]
  // 构造mock的mutation触发函数,调用后返回成功的Promise
  const mockUserSearch = jest.fn().mockResolvedValue(mockExpected)
  // 让useUserSearchMutation返回我们构造的触发函数
  (useUserSearchMutation as jest.Mock).mockReturnValue([mockUserSearch, {}])

  const { result } = renderHook(() => useUserSearch())

  await act(async () => {
    result.current.setSearchString('abc5')
    // 等待微任务执行完成,保证useEffect内的Promise逻辑执行完毕
    await Promise.resolve()
  })

  // 验证mutation调用参数符合预期
  expect(mockUserSearch).toHaveBeenCalledWith({
    orgId: "1",
    userId: "1",
    searchQuery: "abc5"
  })
  // 验证options状态正确赋值
  expect(result.current.options).toEqual(mockExpected)
})
  1. 异常场景测试示例:
it('接口请求失败时options置为空数组', async () => {
  const mockUserSearch = jest.fn().mockRejectedValue(new Error('请求失败'))
  (useUserSearchMutation as jest.Mock).mockReturnValue([mockUserSearch, {}])

  const { result } = renderHook(() => useUserSearch())

  await act(async () => {
    result.current.setSearchString('abc5')
    await Promise.resolve()
  })

  expect(result.current.options).toEqual([])
})

方案2:Mock接口请求(集成测试场景适用)

如果需要测试包含RTK Query流程的完整逻辑,无需mock钩子,直接拦截接口请求即可:

  • 可以用MSW(Mock Service Worker)拦截POST /org/patient/search请求,返回模拟数据,该方案更贴近真实运行场景,适合集成测试。
  • 注意使用该方案时需要保证测试用的Redux Store正确集成了RTK Query的reducer和中间件。

内容的提问来源于stack exchange,提问作者NIsham Mahsin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:06:02