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

Vitest中如何mock useLocation?遇state解构空值错误

解决Vitest中mock useLocation时state为null的报错问题

你遇到的错误是因为测试环境中默认mock的useLocation返回的state为null,但业务代码直接对state进行了解构,导致报错。以下是具体的解决步骤:

1. 全局mock useLocation并指定state值

在测试文件顶部,通过Vitest的vi.mock方法直接mockreact-router-dom的useLocation,让它返回包含目标state的对象:

import { vi } from 'vitest';
import { useLocation } from 'react-router-dom';

// 全局mock useLocation
vi.mock('react-router-dom', () => ({
  useLocation: vi.fn().mockReturnValue({
    state: {
      selectedTemplateName: '测试模板名称' // 替换为你需要的测试值
    }
  })
}));

2. 单个测试用例中动态修改state

如果需要在不同测试用例中使用不同的state值,可以先将useLocationmock成空函数,再在每个测试用例中单独设置返回值:

import { vi } from 'vitest';
import { useLocation } from 'react-router-dom';

// 先mock成空函数
vi.mock('react-router-dom', () => ({
  useLocation: vi.fn()
}));

test('测试选中模板的场景', () => {
  // 为当前测试用例设置state
  (useLocation as jest.Mock).mockReturnValue({
    state: { selectedTemplateName: '模板A' }
  });
  
  // 渲染组件并执行断言逻辑
  // ...
});

test('测试state为空的场景', () => {
  // 模拟state为null的情况
  (useLocation as jest.Mock).mockReturnValue({ state: null });
  
  // 这里需要确保业务代码有处理state为null的逻辑,否则仍会报错
  // ...
});

补充:优化业务代码避免潜在报错

如果需要兼容state为null的场景,可以修改业务代码,添加可选链或默认值处理:

const location = useLocation();
const state = location.state as { selectedTemplateName: string } | null;
const selectedTemplateName = state?.selectedTemplateName || '默认模板';

这样即使state为null,也不会触发解构报错,同时测试时也能覆盖更多场景。

内容的提问来源于stack exchange,提问作者Vipina K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 23:21:02