首先:随意告诉我这是一个反模式!
在我的代码中,我有一些函数负责调用外部API。这是在测试中进行模拟的主要候选者,以确保在运行测试时不会遇到外部API。
问题是,模拟在python中的工作方式(至少我教过的方式),我们明确地在导入的模块结构中模拟一个位置,例如。
import mymodule
def test_api():
mocker.patch('mymodule.mysubmodule.json_apis.my_api_wrapper_function')
[...]
这将模拟测试的my_api_wrapper_function
函数。但是,如果重构移动函数或重命名它等等,该怎么办?如果测试没有更新,它很可能会通过,并且外部API被命中,因为函数的新位置没有被模拟。
我看到这个问题的两个解决方案,但我不确定如何实现其中任何一个
pytest
) 答案 0 :(得分:0)
首先是句子
如果测试没有更新,它很可能会通过,并且外部API被命中,因为函数的新位置没有被模拟。
错误。
如果您尝试模拟不存在的内容并且您不使用create=True
属性,则修补程序会失败!
>>> from mock import patch
>>> patch("doesnt.exist").start()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/mock.py", line 1396, in start
result = self.__enter__()
File "/usr/local/lib/python2.7/dist-packages/mock.py", line 1252, in __enter__
self.target = self.getter()
File "/usr/local/lib/python2.7/dist-packages/mock.py", line 1414, in <lambda>
getter = lambda: _importer(target)
File "/usr/local/lib/python2.7/dist-packages/mock.py", line 1098, in _importer
thing = __import__(import_path)
ImportError: No module named doesnt
此外,如果您使用一些好的重构工具,例如集成在PyCharm中的工具,它会在移动时修复字符串路径。