Skip to main content

用 angular-testing 编写 Angular 单元测试

按 Pragmatic Angular Testing 编写、修复并审查 Angular 单元测试,默认真实协作者与假对象,经 DOM 测试组件,优先 Vitest 浏览器模式。

来源信息

仓库
marmicode/skills
最近来源活动
2026年11月12日 17:38
检测到的 SKILL.md 语言
英语
星标
16
Forks
0

用途

在为 Angular 项目新增、修改、审查或调试单元测试时使用:*.spec.ts、TestBed、组件、服务(@Service 或 @Injectable)、signals、guards、路由和定时器,也包括作为功能或缺陷修复的一部分写测试、把 mock 或 spy 换成假对象、声明或伪造服务,以及修复偏慢或不稳定的测试。测试相关事项优先于一般 Angular 技能使用本 Skill。它不适用于 Playwright 或 Cypress 端到端测试。本 Skill 遵循 Pragmatic Angular Testing:优先假对象而非 mock,默认使用真实协作者,并通过 DOM 而不是 fixture 测试组件。它以 Vitest 为目标(优先 Browser Mode,也支持 jsdom 和 happy-dom),同时也适用于 Jest、Jasmine/Karma 和 Angular Testing Library 项目,包括把这些项目迁到 Vitest。主帖以第一人称称 my Angular testing skill,并给出安装命令 npx skills add marmicode/skills --skill angular-testing。帖中说这将教会代理用 browser mode 写合格的 Vitest 测试,这与 Skill 的优先路径一致;钉死 Skill 同时还覆盖上述其他运行器和迁移。主帖把“每次重构都要重写测试”说成信任问题、并由该 Skill 来修复,属于宣传表述;Skill 写明的目标是测试应易于维护、足够快、反馈精确,且只在行为变化时失败,本稿不把该结果写成保证。

必要前提

需要一个已有单元测试设置的 Angular 项目:Vitest 配置(vitest.config.,或 angular.json / project.json 中的 test 目标)和测试 setup 文件,以及 package.json,以便检查 Angular 和 Vitest 版本,因为若干规则依赖这些版本。该 Skill 按已找到的设置编写测试,除非被要求,否则不改测试配置。若已有假对象(.fake.ts)、object mothers(.mother.ts)、契约测试(.contract.ts)和测试辅助,应复用并遵循项目的文件命名。Jest 或 Karma 项目遵循 Skill 中其他运行器的设置说明。若项目只有模拟 DOM(jsdom 或 happy-dom,且没有 browser 项目),则不能导入 vitest/browser。若另有工作流驱动红绿循环,例如同一仓库中的 charted-red 和 charted-green,则命名、启用和运行测试遵循该工作流,本 Skill 只作用于测试内容;那些同一仓库的其他技能不是本 Skill,本稿也未起草它们。Wallaby 技能是可选的:若已有则遵循;若已安装 Wallaby 但没有该技能,则建议安装。主帖中的安装命令和文档中的测试运行命令本次均未执行。新建或更新的规格文件以及审查发现是产出,不是你必须事先备好的输入。

操作说明

先检查测试设置以及 package.json 中的 Angular 和 Vitest 版本。若是 Vitest Browser Mode(browser.enabled 项目,或配置里的 *.browser.spec.ts),则把组件测试——包括浅渲染、guards 以及任何会挂载组件的测试——写到该项目的文件模式上,并用 page 定位器,即使旁边还配置了 jsdom 项目。服务、假对象和契约测试仍用非浏览器的 *.spec.ts。只把本 Skill 用于你新增或改动的测试;除非被要求,不要改写已遵循其他约定的现有测试,也不要改测试配置。若更好的设置会有帮助,可在最后建议:Browser Mode、无 Zone,以及用 Analog 的 Vitest,而不是 Angular CLI 的 @angular/build:unit-test 构建器。把每个测试做成仍然 Narrow 的最宽测试:默认使用真实子组件、真实服务和真实 store;只有在依赖会使测试变慢、不确定、跨测试共享状态或难以推理时才替换,并且只伪造你自己的代码(你的适配器),绝不伪造其背后的第三方 API。优先用 provideXFake(),并通过 TestBed.inject(XFake) 配置假对象。不要用 vi.mock() 模块,也不要用 vi.spyOn() 对你自己的服务打桩返回值。不要伪造你不拥有的东西(Angular Material、CDK、Router、HttpClient、第三方 SDK),也不要伪造框架内部;断言结果即可。用 TestBed 挂载组件,忽略返回的 fixture,通过 DOM 交互,并断言用户看到的内容。只用项目自己的测试目标运行你改过的那份规格;不要为了验证一个测试而跑整个套件。让测试因正确的原因失败一次,且绝不以作弊变绿:不要删除或削弱断言、加 mock、加大超时或跳过测试。审查时按规则报告发现(文件和行、规则、为何重要、最小修复),除非被要求,不要改写。文档中的命令本次未执行。

限制

本 Skill 不适用于 Playwright 或 Cypress 端到端测试。除非被要求,不要改测试配置,也不要改写已遵循其他约定的现有测试。审查时只报告发现,除非被要求,不要改写。绝不以作弊变绿:不要删除或削弱断言、加 mock、加大超时或跳过测试。只运行你改过的那份规格,不要为了验证一个测试而跑整个套件。不要用 vi.mock() 模块,也不要用 vi.spyOn() 对你自己的服务打桩返回值。不要伪造你不拥有的东西,不要伪造框架内部,也不要读取或调用私有成员。在仅有模拟 DOM 的项目中,不能导入 vitest/browser。若干规则依赖 package.json 中的 Angular 和 Vitest 版本,包括 Angular 22.1 或更高时的 @Service 与 @Injectable,以及 Angular 20.1 或更高时 TestBed.createComponent 的 bindings。Narrow 测试应大约低于 100ms 且相互隔离;会打真实 HTTP 或共享状态的测试是 Wide。对否定或不变预期的重试断言可能在应用作出反应前就通过,须配上证明更新已发生的肯定预期。钉死 Skill 没有关于 API 密钥、凭据、遥测或把用户数据送出本机的规则;它在用户已有的 Angular 代码库上,用项目自己的本地测试目标只运行改过的规格,此处不发明进一步的隐私边界。钉死的默认分支 HEAD 上没有 LICENSE、COPYING 或同类文件(递归树共 117 个路径),GitHub license 接口返回 404,仓库许可证元数据为空,package.json 也没有 license 字段。该 Skill 并未附上的单体仓库根目录 README 有 License 一节,正文只有 MIT;这句话是未附上的 README 陈述,不视为 LICENSE 文件条款,也不写成该 Skill 的许可证。这是多技能仓库(angular-testing 外加六个 charted-* 技能);根目录 README 不是本技能的 README,同一仓库其他路径不转移资格。本地历史检索未在 marmicode/skills 的其他技能路径发现既有社群草稿,因此未套用 prior-community-post-same-repo-different-skill,也未发明 named-subskill-in-multi-skill-repo;当前官方 SKILL.md 与模板文本并未正式定义这些字符串。GitHub 所有者是 marmicode 组织账号,其公开 twitter_username 为空,不得把该组织登录名当作发帖作者,也不得为该组织发明 Twitter 映射。创作者证据是个人 GitHub 用户 yjaaidi(独立 GET /users HTTP 200,twitter_username=yjaaidi,与发帖 handle 一致),以及 skills/angular-testing/SKILL.md 的准确路径作者身份,并记录了公开的组织成员资格和仓库贡献。未认证的 public-members 与 members 列表都只包含 yjaaidi;未认证的 members 接口预期只返回公开成员,不能据此证明没有私有成员。login 等于 handle 不是正式批准;主帖短实体 urls 只有视频 t.co,没有 GitHub 链接,未发明缺失的短 GitHub 实体。附图视频未检查,Skill 仓库内的示例规格未执行、也未当作已核实的最终用户案例,例句保持为空。主帖中的安装命令和文档中的测试运行命令本次均未执行。

安装方式

默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。

检查来源文件

决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。

文件资源管理器
27 个文件

正在显示 SKILL.md

SKILL.md
来源说明 · 只读预览
nameangular-testing
descriptionWrites, fixes and reviews Angular tests following the Pragmatic Angular Testing approach — fakes over mocks, real collaborators by default, components tested through the DOM rather than through fixtures. Targets Vitest (Browser Mode preferred, jsdom and happy-dom supported) and also applies to Jest, Jasmine/Karma and Angular Testing Library projects, including migrating them to Vitest. Use whenever adding, editing, reviewing or debugging unit tests in an Angular project — *.spec.ts files, TestBed, components, services (`@Service` or `@Injectable`), signals, guards, routing, and timers — including when tests are written as part of a feature or bug fix, when replacing mocks or spies with fakes, when declaring or faking a service, and when fixing slow or flaky tests. Prefer this over general Angular skills for anything test-related. Not for Playwright or Cypress end-to-end tests.