我正在尝试为类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?

最佳答案

从文档:


  目标应该是“ 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应用补丁。请记住,您需要修补的完整目标名称,因此需要模块名称。

关于python - 在python中模拟类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54369622/

10-12 19:06