我有一个看起来像这样的包:
lcl
|
| - lcl
| - LCL.py
| - lunabuild.py
在lunabuild模块中,有一个Lunabuild类。 Lunabuild类有一个方法Lunabuild.configure_jobs()。 LCL类导入lunabuild:
from lcl import lunabuild
然后将其用作懒惰实例化的属性:
@property
def luna_build(self):
self._luna_build = lunabuild.Lunabuild()
LCL类有一个运行Lunabuild.configure_jobs()方法的main()方法:
main(self)
try:
self.luna_build.configure_jobs()
except ValidationError:
...
except Exception, e:
return_code = 2
self.logger_exception(e)
我正在尝试修补configure_jobs以产生引发错误的side_effect,以便我可以测试未按预期记录未知错误。
我一直无法弄明白where to patch。它一直告诉我它不能识别属性,或者lunabuild没有configure_jobs属性。
我尝试了很多不同的选择。运行附加的调试器,我可以看到以下代码中的test_lcl是lcl.lunabuild.Lunabuild对象
更新: 我的最新尝试是
with patch.object('lcl.lunabuild.Lunabuild', 'configure_jobs') as mock:
mock.side_effect = OSError(2, 'message')
retcode = test_lcl.main()
self.assertEquals(retcode, 2)
答案 0 :(得分:1)
更简单的方法是在configure_jobs
类定义中路径Lunabuild
方法的静态引用。因此,使用follow代码应该完全符合您的需要
with patch('lcl.lunabuild.Lunabuild.configure_jobs', side_effect=OSError(2, 'message')) as mock:
retcode = test_lcl.main()
self.assertEquals(retcode, 2)
如果您想要修补您在测试中使用的对象,可以通过以下方式进行修补:
with patch.object(test_lcl.luna_build, 'configure_jobs', side_effect = OSError(2, 'message')) as mock:
retcode = test_lcl.main()
self.assertEquals(retcode, 2)
我的意思是在我没有其他机会时使用patch.object
: