mcpField
D
django-targeted-mocking

django-targeted-mocking

github.com/lvtd-llc测试与质量160 次安装7 周前更新
代码仓库

关于 django-targeted-mocking

面向 Django 测试的技能,指导开发者在缓慢、外部或非确定性边界使用精准且符合接口的模拟。它帮助隔离依赖,同时避免掩盖待验证的行为。

主要功能

  1. 01按边界决定是否模拟
  2. 02在依赖查找处打补丁
  3. 03使用 Django 设置辅助工具
  4. 04采用接口校验的模拟与伪对象
  5. 05阻止意外的外发 HTTP 请求

适用场景

  1. 01测试外部 HTTP 服务集成
  2. 02控制设置、时间或命令输出
  3. 03避免模拟掩盖请求行为

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/lvtd-llc/skills --skill django-targeted-mocking

安装后在 Claude Code 中输入/django-targeted-mocking确认已加载。

附带文件references/mocking-patterns.md

详细介绍

Django 定向模拟

只在缓慢、非确定性、外部或难以触发的边界处使用模拟。宽泛的模拟可以加快测试,但也可能减少测试所能证明的内容,因此应优先使用框架辅助工具和经过接口检查的替代对象。

边界工作流

  1. 判断是否有必要使用模拟。

    • 本地领域逻辑优先使用真实代码。
    • 模拟外部 HTTP、时间、设置、输出/输入以及开销较大的服务边界。
  2. 在被测代码查找依赖的位置打补丁。

    • 应补丁修改被测模块使用的导入符号,而不是原始库路径,除非该模块读取的正是原始库路径。
  3. 优先使用专用工具。

    • 设置:使用 override_settings、modify_settings 或 pytest-django 的 settings fixture。
    • 输出:使用 io.StringIO、pytest 的 capsys 或命令测试辅助工具。
    • HTTP:手动编写响应时使用 requests-mock;使用录制的响应时使用 VCR.py。
    • 时间:尽可能将时间作为参数传入;否则使用 time-machine 或类似的时间专用工具。
  4. 让模拟对象符合接口。

    • 使用 autospec=True、spec、spec_set、create_autospec 或小型 fake 对象。
    • 接口很重要时,避免使用裸 Mock/MagicMock。
  5. 阻止意外的出站 HTTP 请求。

    • 正常测试运行中,如果测试意外访问网络,应当失败。

阅读 mocking-patterns.md 查看具体模式。

决策规则

  • 使用 Django 设置辅助工具,而不是直接赋值给 django.conf.settings。
  • 只需要少量属性时,优先使用手工构建的 fake 或 types.SimpleNamespace。
  • 使用 requests-mock 模拟你控制的确定性 API 响应。
  • 当真实录制的响应有价值且可以安全存储时,使用 VCR.py。
  • 在 CI 上配置 VCR 录制模式,使缺少 cassette 时失败,而不是进行录制。
  • 在整个运行时中一致地模拟时间;不要手动补丁多个 datetime 函数。
  • 不要模拟测试意图验证其行为的组件。

常见错误

  • 直接补丁设置,导致状态泄漏到其他测试。
  • 使用能接受拼写错误的属性和错误调用签名的兜底 MagicMock 对象。
  • 允许测试访问真实的外部服务。
  • 在 CI 中录制 VCR cassette。
  • 过度模拟视图的内部辅助函数,导致测试不再覆盖请求行为。
  • 补丁了错误的导入路径,却以为模拟已经生效。

验证

完成前,请确认:

  • 每个模拟都有明确的边界理由。
  • 对接口敏感的模拟使用了规格或 fake 对象。
  • 常规测试套件会阻止意外的出站 HTTP 请求。
  • 设置会由 Django 或 pytest 辅助工具自动恢复。
  • 测试仍在覆盖实际行为,而不只是模拟调用。

评论

支持 Markdown