我正在尝试为类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?
答案 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
。请记住,您需要修补的完整目标名称,因此需要模块名称。