state / getter / 断言
基于 @pinia/testing v1.x 编写
速查
- 改 state:
store.x = 1或store.$patch({ ... })(testing pinia 下可写) - 覆盖 getter:
store.double = 3(测试中 getter 可写);赋undefined恢复 - 断言 action:
expect(store.action).toHaveBeenCalledOnce()/toHaveBeenCalledWith(...) - 类型:要用
.mockResolvedValue等需mockedStore(useStore)包装
直接修改 state
testing pinia 下 state 可写,直接赋值或 $patch:
ts
const store = useSomeStore();
store.name = "new name"; // 直接赋值
store.$patch({ count: 10 }); // 或 $patch
expect(store.name).toBe("new name");测试中无需绕过任何 setter,状态设置极方便。
覆盖 getter
测试环境下 getter 是可写的,直接赋值即可 mock 返回:
ts
const counter = useCounterStore();
counter.double = 3; // 覆盖 getter,返回 3
// 恢复默认计算:赋 undefined
// @ts-expect-error 类型是 number,但可这样重置
counter.double = undefined;
counter.double; // 回到正常计算断言 action 被调用
stub(默认)或 false 模式下 action 都是 spy,用标准断言:
ts
const store = useSomeStore();
expect(store.someAction).toHaveBeenCalledTimes(1);
expect(store.someAction).toHaveBeenCalledWith(arg1, arg2);
expect(store.someAction).toHaveBeenLastCalledWith(/* ... */);
expect(store.someAction).toHaveBeenCalledOnce(); // Vitest 语义化mockedStore 类型工具
TS 类型上 action 仍是普通函数,要用 .mockResolvedValue() 等 mock API 需用 mockedStore 包装(官方提供的类型工具):
ts
// 简化用法:把 store 的 action 标注为 Mock 类型
const store = mockedStore(useSomeStore);
store.someAction.mockResolvedValue("mocked value"); // 类型安全
mockedStore是一段类型工具函数(见官方文档),运行时只是useStore(),作用是让 TS 把 action 识别为 spy,从而能用mockResolvedValue等。
action / 选项的完整说明见 选项。