pinia 单元测试需用 @pinia/testing 的 createtestingpinia() 创建隔离实例,默认 stub action 以聚焦逻辑断言;通过 setactivepinia 激活后,可直接断言 state/getter、校验 action 调用或启用真实执行,并支持 initialstate 预设和 $reset 验证。

Pinia 在单元测试中模拟和验证状态仓库行为,核心是用 @pinia/testing 提供的 createTestingPinia() 创建隔离、可控的测试专用 Pinia 实例,而不是直接用生产环境的 createPinia()。它默认 stub 所有 action,避免副作用干扰,让测试聚焦在逻辑断言本身。
用 createTestingPinia 替代普通 Pinia 实例
在 Vitest 或 Jest 中,不调用 createPinia(),而是导入并使用官方测试模块:
- 安装依赖:
pnpm add -D @pinia/testing(需已安装 pinia ≥ 4.0.2) - 在测试文件顶部导入:
import { setActivePinia, createTestingPinia } from '@pinia/testing' - 在
beforeEach中激活测试实例:setActivePinia(createTestingPinia()) - 这样后续调用
useCounterStore()时,store 就会自动绑定到这个测试 Pinia,且所有 action 默认不执行真实逻辑
验证 store 状态与 getter 行为
state 和 getter 是响应式只读属性,可直接读取并断言:
- 调用 store 后,直接访问
store.count、store.doubleCount等属性 - 修改 state(如
store.count++)后,getter 应实时更新:expect(store.doubleCount).toBe(2) - 注意:若使用
stubActions: true(默认),action 调用不会改变 state;如需测试真实 action 效果,可设stubActions: false或对特定 action 取消 stub
控制 action 执行并校验调用过程
默认情况下 action 被替换成 jest/vi mock 函数,便于验证是否被调用、传参是否正确:
- 调用
store.increment()后,可用expect(store.increment).toHaveBeenCalled()断言触发 - 检查参数:
expect(store.increment).toHaveBeenCalledWith(2) - 若需跳过 stub、运行真实逻辑(例如测试异步请求流程),可在创建时配置:
createTestingPinia({ stubActions: false }) - 也可选择性 stub:
createTestingPinia({ stubActions: { increment: false, reset: true } })
预设初始状态与重置行为
通过 initialState 快速构造确定的测试起点,用 $reset 验证恢复逻辑:
- 初始化时注入状态:
createTestingPinia({ initialState: { counter: { count: 5 } } }) - 调用
store.$reset()后,state 应回到初始值(或定义的 reset 逻辑) - 若插件修改了
$reset行为(如持久化插件),可通过stubReset: false让其真实执行,再断言 localStorage 是否清空等










