在python中模拟类

时间:2019-01-25 16:53:33

标签: python mocking

我正在尝试为类vBundle创建一个模拟。这是我的操作方式:

from vBundle import vBundle

@mock.patch('vBundle')
def test_one_job_end_to_end(self, vBundle_mock):        
    vBundle_mock.return_value.download_bundle.side_effect = vBundle_download_bundle_mock_01
    bundle = vBundle()
    bundle.download_bundle('456', '/tmp/')

运行代码时,出现以下错误:

File "/Users/user/Library/Python/2.7/lib/python/site-packages/mock/mock.py", line 1670, in patch
    getter, attribute = _get_target(target)
  File "/Users/user/Library/Python/2.7/lib/python/site-packages/mock/mock.py", line 1522, in _get_target
    (target,))
TypeError: Need a valid target to patch. You supplied: 'vBundle'

问题:为什么vBundle不是有效的目标?我应该在@mock.patch中输入什么以正确地指代vBundle?

1 个答案:

答案 0 :(得分:1)

从文档中

  

target应该是“ package.module.ClassName”形式的字符串。导入目标并将指定的对象替换为新对象,因此目标必须可从您从其调用patch()的环境中导入。在执行装饰功能时(而不是在装饰时)导入目标。

在示例代码中,vBundle被导入,因此名称vBundle现在在当前模块中(也称为myModule.vBundle

from vBundle import vBundle

@mock.patch('mymodule.vBundle')
def test_one_job_end_to_end(self, vBundle_mock):        
    vBundle_mock.return_value.download_bundle.side_effect = vBundle_download_bundle_mock_01
    bundle = vBundle()
    bundle.download_bundle('456', '/tmp/')

另一种替代方法是只提高vBundle模块(而不是类)并将补丁应用到vBundle.vBundl。请记住,您需要修补的完整目标名称,因此需要模块名称。