【问题标题】:mock.patch() not patching class who called a couples of levels inside function callmock.patch() 不修补在函数调用中调用了几个级别的类
【发布时间】:2014-10-19 23:37:38
【问题描述】:

我有一个任务

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

UPD1DriverWorker 存在于不同的模块中,Worker 导入 Driver

【问题讨论】:

  • Driver 是模块Worker 中的全局变量;您是在修补那个全局还是从哪里导入全局?
  • 但是如果你正在对task进行单元测试,你可能只想模拟整个工人..
  • @MartijnPieters 我可以只修补驱动程序。让它这样工作对我来说很重要吗?
  • 从测试哲学的角度来看,你会嘲笑 Worker;但如果修补驱动程序更容易,则将其称为集成测试并完成它。 :-)

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


【解决方案1】:

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

from MyProject.utils.drivers import Driver

这是对Driver 类的新的单独引用。如果您现在修补MyProject.utils.drivers.DriverWorker将看不到修补的对象;因为它将使用它自己的全局引用。

补丁全局Worker实际使用:

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

请参阅mock 文档中的Where to patch section

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 2012-05-03
    • 2020-11-16
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多