测试
测试 IO 时,建议把验证分成三层:结果值、更新过程、历史回放。
snapshot():验证最终状态值。subscribeUpdate():验证 patch 结构与更新路径。replay():验证更新日志可重放性。
- 你要验证业务逻辑的最终状态是否正确。
- 你要断言更新日志(操作类型、路径、值)是否符合预期。
- 你要确保更新流可回放用于审计或调试。
核心断言模式
Section titled “核心断言模式”1) 结果断言(优先)
Section titled “1) 结果断言(优先)”import { describe, expect, it } from 'vitest';import { io } from '@iostore/store';
describe('counter', () => { it('increments', () => { const store = io({ count: 0 }); store.count.set((v) => v + 1); expect(store.count.snapshot()).toBe(1); });});2) Patch 断言
Section titled “2) Patch 断言”import { io } from '@iostore/store';
const store = io({ count: 0 });const updates: unknown[] = [];const stop = store.subscribeUpdate((u) => updates.push(u));
store.count.set(1);stop();
expect(updates[0].patches[0].op).toBe('set');3) 回放断言
Section titled “3) 回放断言”import { io } from '@iostore/store';import { replay } from '@iostore/store/patches';
const base = io({ count: 0 });const updates: unknown[] = [];const stop = base.subscribeUpdate((u) => updates.push(u));
base.count.set(1);base.count.set(2);stop();
const replayStore = io({ count: 0 });replay(replayStore, updates);expect(replayStore.count.snapshot()).toBe(2);- 只断言
set()是否被调用,不断言最终值。 - 直接比较整段更新对象,导致测试脆弱。
- 忘记退订,影响后续用例隔离。
- 先写“结果断言”,再补“过程断言”。
- patch 断言聚焦关键字段(
op、path、核心值)。 - 对关键链路增加回放测试,保证可追溯性。