关于 django-targeted-mocking
面向 Django 测试的技能,指导开发者在缓慢、外部或非确定性边界使用精准且符合接口的模拟。它帮助隔离依赖,同时避免掩盖待验证的行为。
主要功能
- 01按边界决定是否模拟
- 02在依赖查找处打补丁
- 03使用 Django 设置辅助工具
- 04采用接口校验的模拟与伪对象
- 05阻止意外的外发 HTTP 请求
适用场景
- 01测试外部 HTTP 服务集成
- 02控制设置、时间或命令输出
- 03避免模拟掩盖请求行为
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ lvtd-llc/ skills --skill django-targeted-mocking安装后在 Claude Code 中输入/django-targeted-mocking确认已加载。
附带文件references/mocking-patterns.md
详细介绍
Django 定向模拟
只在缓慢、非确定性、外部或难以触发的边界处使用模拟。宽泛的模拟可以加快测试,但也可能减少测试所能证明的内容,因此应优先使用框架辅助工具和经过接口检查的替代对象。
边界工作流
-
判断是否有必要使用模拟。
- 本地领域逻辑优先使用真实代码。
- 模拟外部 HTTP、时间、设置、输出/输入以及开销较大的服务边界。
-
在被测代码查找依赖的位置打补丁。
- 应补丁修改被测模块使用的导入符号,而不是原始库路径,除非该模块读取的正是原始库路径。
-
优先使用专用工具。
- 设置:使用
override_settings、modify_settings或 pytest-django 的settingsfixture。 - 输出:使用
io.StringIO、pytest 的capsys或命令测试辅助工具。 - HTTP:手动编写响应时使用
requests-mock;使用录制的响应时使用 VCR.py。 - 时间:尽可能将时间作为参数传入;否则使用
time-machine或类似的时间专用工具。
- 设置:使用
-
让模拟对象符合接口。
- 使用
autospec=True、spec、spec_set、create_autospec或小型 fake 对象。 - 接口很重要时,避免使用裸
Mock/MagicMock。
- 使用
-
阻止意外的出站 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