为何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
相关产品推荐
相关产品推荐

