ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

580+ 测试用例的工程实践:skills-manage 如何测试 Tauri IPC、Zustand Store 与 Rust 后端

580+ 测试用例的工程实践:skills-manage 如何测试 Tauri IPC、Zustand Store 与 Rust 后端 580 测试用例的工程实践skills-manage 如何测试 Tauri IPC、Zustand Store 与 Rust 后端【免费下载链接】skills-manageDesktop app to manage AI coding agent skills across Claude Code, Cursor, Gemini CLI, Codex, and 20 platforms from one place.项目地址: https://gitcode.com/gh_mirrors/sk/skills-manageskills-manage 是一款跨平台桌面工具让你在一处统一管理 Claude Code、Cursor、Gemini CLI、Codex 等 20 个 AI 编程平台的技能Skills。作为典型的 Tauri v2 应用它同时包含 React 前端与 Rust 后端两套代码——那么它是怎么测试的本文将带你拆解这个项目的测试体系580 个前端用例、300 个 Rust 测试如何覆盖 Tauri IPC 调用、Zustand Store 状态和 React 组件三层。一、测试体系总览两层架构三套测试项目的整体架构是「React 前端 → Tauri IPC → Rust 后端 → SQLite」测试也严格对应这三层测试层工具链用例规模代码位置React 组件 / UIVitest Testing Library jsdom370src/test/Zustand StoreIPC 集成Vitest Mock invoke200src/test/Rust 后端命令cargo test340src-tauri/src/前端测试由 package.json 中的test脚本驱动即vitest run配置集中在 vite.config.ts 的test字段——开启globals: true、使用jsdom环境并指定了全局初始化文件src/test/setup.ts。Rust 端则在 CLAUDE.md 中明确记录了cd src-tauri cargo test的运行方式。 值得注意的细节测试文件与源码不放在同一目录而是统一收纳在 src/test/ 下命名为Xxx.test.ts(x)。这种平铺结构让「哪些东西被测试过」一目了然。二、测试 Tauri IPC一切从 Mock 掉 invoke 开始Tauri 应用最棘手的地方在于前端每一句invoke(xxx)背后都连着 Rust 命令而单元测试环境里没有真正的 Rust 进程。skills-manage 的解法非常干脆——两层 Mock第一层全局兜底。在 src/test/setup.ts 中通过Object.defineProperty给window.__TAURI__和window.__TAURI_INTERNALS__挂上vi.fn()桩保证任何组件在 jsdom 里渲染时都不会因为缺少 Tauri 环境而崩溃。第二层精确断言。在需要验证具体调用时测试文件会 Mocktauri-apps/api/core模块vi.mock(tauri-apps/api/core, () ({ invoke: vi.fn(), }));以 src/test/skillStore.test.ts 为例它先mockResolvedValueOnce(mockSkills)注入一组模拟的扫描结果再断言invoke是否以正确的命令名和参数被调用——比如expect(invoke).toHaveBeenCalledWith(get_skills_by_agent, { agentId: claude-code })。这样既验证了命令名拼写snake_case 与 camelCase 的转换正确性又验证了参数结构等价于给 IPC 协议本身做回归测试。三、测试 Zustand Store状态重置与 IPC 协同项目使用 Zustand 管理全部业务状态每个 Store 都有对应测试文件例如 src/test/centralSkillsStore.test.ts、src/test/collectionStore.test.ts、src/test/discoverStore.test.ts 等。测试模式高度统一可复制性强beforeEach重置状态通过useSkillStore.setState({ skillsByAgent: {}, ... })把 Store 恢复到初始态再vi.clearAllMocks()清空调用记录保证用例之间零串扰验证初始状态断言getState()返回的字段符合预期验证动作触发 Store 的异步方法断言 IPC 调用与状态更新的完整链路验证错误路径让invoke返回 rejection断言error字段被正确填充。这套「重置 → 断言初始态 → 驱动动作 → 断言终态」的范式使得 10 个 Store 的测试风格完全一致新人看一个文件就能上手所有文件。四、React 组件测试i18n Mock 是隐藏的关键src/test/ 下有 20 多个组件测试覆盖侧边栏Sidebar.test.tsx、设置页SettingsView.test.tsx、安装对话框等核心界面。其中最巧妙的设计在 src/test/setup.ts它没有启动真实的 i18n 实例而是直接vi.mock(react-i18next)用一个小函数把翻译 key如sidebar.settings解析到 zh.json 的真实中文文案上。好处是双重的——组件里t(xxx)渲染出的是稳定的中文文本断言不会因语言环境漂移支持{{var}}插值行为与真实 i18next 一致。此外setup.ts 还为 jsdom 补了一个PointerEventpolyfill——因为 base-ui 的 Checkbox/Radio 组件内部依赖它而 jsdom 并不实现。这类「基础设施补丁」放在全局 setup 里只做一次所有测试文件受益。五、Rust 后端测试340 用例守护核心命令Rust 侧的测试分散在 src-tauri/src/ 各模块内用#[test]/#[tokio::test]标注合计 340 个。几个重点模块src-tauri/src/db.rs44 个测试覆盖 SQLite 数据库层的读写与迁移src-tauri/src/commands/scanner.rs44 个测试覆盖技能目录扫描、符号链接识别、平台目录映射src-tauri/src/commands/linker.rs33 个测试覆盖跨平台安装symlink / copy 双模式。这些测试大量使用临时目录模拟~/.claude/skills等真实路径结构配合cargo test db::这类按模块过滤的跑法让日常开发的反馈循环保持在秒级。六、自己动手跑一遍两条命令全量验证无论前端还是后端验证成本都极低pnpm install pnpm test # 前端Vitest 全量测试 cd src-tauri cargo test # Rust 后端全量测试配合 CLAUDE.md 中记录的pnpm test -- src/test/skillStore.test.ts单文件与cargo clippy -- -D warnings零警告 Lint项目形成了「测试 类型检查 Lint」三合一的质量护栏。总结这套测试实践最值得借鉴的 3 点Mock 分层全局 setup 兜底环境__TAURI__、i18n单测内精确 Mock IPC职责清晰不重复范式统一Store 测试「重置→断言→驱动→断言」四步曲580 用例风格一致维护成本低前后端对等React 层 580 用例与 Rust 层 340 用例体量相当IPC 协议两端各守一道关。对于想学习 Tauri 桌面应用测试的开发者来说src/test/setup.ts 和 src/test/skillStore.test.ts 是最值得精读的两个文件——它们把「如何在没有真实后端的浏览器环境里测试一个桌面应用」这件事讲得明明白白。【免费下载链接】skills-manageDesktop app to manage AI coding agent skills across Claude Code, Cursor, Gemini CLI, Codex, and 20 platforms from one place.项目地址: https://gitcode.com/gh_mirrors/sk/skills-manage创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表