Store 测试、Vuex 迁移与交付
Store 测试应围绕业务不变量,而不是把每个 getter 实现复制一遍。一个合格的测试至少覆盖:初始状态、一次成功 action、失败后状态、重复调用和用户切换清理。需要组件测试时,@pinia/testing 可以提供隔离的 testing pinia;但它不能替代真实 action 的单元测试。
先固定行为再迁移
Vuex 到 Pinia 的迁移先选一个低风险模块,记录旧模块的输入、提交顺序、错误和持久化行为。把 mutation 合并进同步 action,把 namespace 变成 store id;保留一轮旧实现与新实现的同输入对照,确认状态快照和副作用一致,再删除旧模块。
测试契约
ts
it('失败时保留旧数据并暴露错误', async () => {
const store = useOrdersStore()
store.orders = [{ id: '1' }]
api.list.mockRejectedValueOnce(new Error('offline'))
await expect(store.refresh()).rejects.toThrow('offline')
expect(store.orders).toEqual([{ id: '1' }])
expect(store.status).toBe('error')
})这里测试的是产品行为:刷新失败不能把用户已经看到的旧订单抹掉。若产品选择失败清空,也要把这个选择写进契约,而不是让实现细节决定界面。
练习
为一个 Vuex module 设计迁移清单:state、getter、mutation、action、插件、SSR 注水、测试和回滚各写一项;指出哪一项不能通过机械重命名完成。
下一步
完成练习后打开本章答案,再回到Pinia 课程总览。