我在python测试文件中有类似的内容:
from mock import patch,
from ..monkey import ook
[...]
@patch('monkey.ook', Mock(return_value=None))
def test_run_ook (self, mock_ook):
self.assertIsNone(ook())
mock_ook.run.assert_called_once_with('')
当我运行这个测试时,我得到一个ImportError: No module named monkey
。显然,我正在修补的道路是不对的。但是,我不确定如何在不干扰sys.path
或PYTHONPATH
的情况下使它正确。
有什么线索吗?
基于公认的答案,我认为这是实现预期目标的最干净方法:
据我所知,使用mock,您需要在修补时提供一个虚线名称。幸运的是,每个模块都可以访问一个特殊的模块级变量
__name__
,该变量包含模块的名称。使用此选项,如果要修补模块的本地变量,则应该能够执行以下操作:假设您已将该文件保存为
quicktest.py
,那么单元测试将给出以下结果:当然,
from a.b import c
在包中给了您一个简单的变量,所以同样的机制也应该起作用。我使用了Dan Passaro的解决方案,直到我遇到了这个使用
patch.object
的解决方案,这在我看来更好:优点:
__name__ + '.object_to_be_mocked'
的样板代码import
语句。@patch.object(amazon.jungle.monkey, 'ook', …)
,那么您的IDE的静态代码分析可以确保至少amazon.jungle.monkey
是一个有效的变量,因为您没有将整个对象写成一个字符串'amazon.jungle.monkey.ook'
。缺点:
from ..monkey import ook
,但需要执行from .. import monkey
,并通过monkey
访问ook
,即monkey.ook
。如果我需要经常编写这些代码,为了方便起见,我将在测试的开头添加ook = monkey.ook
。(甚至是import语句,以防我不需要模拟monkey
的这个特殊属性。)相关问题 更多 >
编程相关推荐