mock.patch()没有修补类调用函数调用内的几个级别的类

时间:2014-08-26 15:10:41

标签: python unit-testing python-2.7 monkeypatching python-mock

我有一项任务

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类实例,但不是模拟。那是错的。如何解决?

UPD1 DriverWorker住在不同的模块中Worker导入Driver

1 个答案:

答案 0 :(得分:5)

您的MyProject.Workers.base模块导入Driver为全局:

from MyProject.utils.drivers import Driver

这是{em>新的单独引用到Driver类。如果您现在修补MyProject.utils.drivers.Driver,则Worker将看不到修补后的对象;因为它会使用它自己的全局参考。

修补全局Worker实际使用:

with patch('MyProject.Workers.base.Driver', new=Mock(return_value=999)):
    task()

请参阅mock文档的Where to patch section