确保在测试期间无法调用函数

时间:2015-09-30 10:42:10

标签: python unit-testing mocking

首先:随意告诉我这是一个反模式!

在我的代码中,我有一些函数负责调用外部API。这是在测试中进行模拟的主要候选者,以确保在运行测试时不会遇到外部API。

问题是,模拟在python中的工作方式(至少我教过的方式),我们明确地在导入的模块结构中模拟一个位置,例如。

import mymodule

def test_api():
    mocker.patch('mymodule.mysubmodule.json_apis.my_api_wrapper_function')
    [...]

这将模拟测试的my_api_wrapper_function函数。但是,如果重构移动函数或重命名它等等,该怎么办?如果测试没有更新,它很可能会通过,并且外部API被命中,因为函数的新位置没有被模拟。

我看到这个问题的两个解决方案,但我不确定如何实现其中任何一个

  • 以更好的方式模拟东西,以便我确信在重构时不会出现问题
  • 创建一个装饰器,如果在测试上下文中调用该函数,它将包装一个函数并引发异常(我想这取决于使用的测试运行器?在我的例子中,它是pytest

1 个答案:

答案 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中的工具,它会在移动时修复字符串路径。