mock.patch()未对在函数调用中多层调用的类进行打补丁

5 投票
1 回答
1087 浏览
提问于 2025-04-18 18:35

我有一个任务

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 类的实例,但不是一个模拟对象。这不对。怎么解决这个问题?

更新1DriverWorker 生活在不同的模块中,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 的文档。

撰写回答