You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何mock.patch能对已导入对象的属性生效?Django场景解惑

为什么mock.patch对函数和类方法的表现不同?
  • 关于tasks.run_task无法mock的原因:
    当你在views.py里执行from tasks import run_task时,views模块会生成一个独立的run_task引用,指向原函数。你用@mock.patch('tasks.run_task')只是替换了tasks模块里的原函数引用,但视图实际调用的是views模块自己存的那个引用副本,自然mock不会生效。要让mock生效,你得patch视图里实际用的那个引用位置:@mock.patch('views.run_task')。

  • 关于models.Proxmox.api能正常mock的原因:
    Proxmox是类,api是它的类方法。当你在views里导入Proxmox类时,导入的是类的引用,而类方法是存在类的命名空间里的。后续创建Proxmox实例时,实例的api方法会动态绑定到类的api方法上。所以你patchmodels.Proxmox.api时,直接修改了类本身的方法定义,不管哪个模块导入这个类,创建的实例都会使用被mock后的方法,自然就能生效。

简单总结:函数导入是复制引用,类方法是动态绑定到类上的,两者的引用机制不一样,导致mock的有效路径不同。

内容的提问来源于stack exchange,提问作者James Lin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 01:19:55