mock.patch()未对在函数调用中多层调用的类进行打补丁
我有一个任务
def task():
a = worker()
a.do_some_work()
Worker
是一个独立的类,存在于不同的模块中,它像这样使用 Driver
类,
class Worker(object):
def __init__(self):
self.driver = Driver(args)
...
而且 Driver
也是一个独立的类,存在于不同的模块中
所以当我尝试做一些事情时,比如
with patch('package.module.Driver', new=Mock(return_value=999)):
task()
在这个任务里,仍然有一个 Driver
类的实例,但不是一个模拟对象。这不对。怎么解决这个问题?
更新1:
Driver
和 Worker
生活在不同的模块中,Worker
导入了 Driver
1 个回答
8
你的 MyProject.Workers.base
模块把 Driver
作为全局变量引入了:
from MyProject.utils.drivers import Driver
这其实是对 Driver
类的一个 新的、独立的引用。如果你现在去修改 MyProject.utils.drivers.Driver
,那么 Worker
类 是看不到这个修改后的对象 的,因为它会使用自己那份全局引用。
要修改全局的 Worker
实际上使用的是:
with patch('MyProject.Workers.base.Driver', new=Mock(return_value=999)):
task()
可以查看 在哪里修改的部分,了解更多关于 mock
的文档。