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