我在 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
or PYTHONPATH
.
有什么指点吗?
我使用 Dan Passaro 的解决方案,直到我遇到这个patch.object https://docs.python.org/3/library/unittest.mock.html#patch-object– 这对我来说看起来更好:
from unittest.mock import patch,
from .. import monkey
[...]
@patch.object(monkey, 'ook', Mock(return_value=None))
def test_run_ook (self, mock_ook):
self.assertIsNone(monkey.ook())
mock_ook.run.assert_called_once_with('')
优点:
- 不需要样板代码
__name__ + '.object_to_be_mocked'
- 测试用例的所有依赖项都在文件的开头清楚地说明为
import
声明。
- 如果您尝试模拟的对象的点名称较长(例如“amazon.jungle.monkey.ook”),因此您可以编写
@patch.object(amazon.jungle.monkey, 'ook', …)
,你的IDE的静态代码分析至少可以确保amazon.jungle.monkey
是一个有效的变量,因为您没有将整个内容写为字符串'amazon.jungle.monkey.ook'
.
缺点:
- 你不能这样做
from ..monkey import ook
但需要做from .. import monkey
和访问ook
通过monkey
, i.e. monkey.ook
。如果我需要经常写这个,我会添加ook = monkey.ook
为了方便起见,我的测试开始了。 (或者甚至是 import 语句,以防我永远不需要模拟这个特定的属性monkey
.)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)