我正在尝试修补__init__.py
中定义的内部包函数,该函数由同一包内的模块内部的函数使用。我面临的问题是它没有得到补丁。
当我更改了使用需要修补到绝对导入的函数的模块内部的import语句时,我取得了一些成功。问题是我不想要绝对导入,重构代码将是一种痛苦。
我的测试设置的结构是:
|- mylib
| |- __init__.py
| \- process.py
|- tests
| \- test_process.py
|- setup.py
初始化包
# __init__.py
def store_info(info):
raise ValueError('No connection!')
预期情况
# process.py
from . import store_info
def process_info(info):
store_info(info)
# test_process.py
from unittest.mock import patch
import mylib.process
@patch('mylib.store_info')
def test_process_info(store_info_mock):
info = "Some info"
mylib.process.process_info(info)
store_info_mock.assert_called_with(info)
当我将process.py
中的导入从相对导入更改为绝对导入时,它可以正常工作。
# process.py
import mylib
def process_info(info):
mylib.store_info(info)
使用像import mylib
这样的import语句,测试通过适当的修补模拟。使用像from . import store_data
这样的语句,函数不会被修补。
是否有可能使用相对导入并仍然能够在同一个包中修补功能?如果是这样,对此有什么好的做法?
你正在修改它声明的函数;相反,你应该修改它实际使用的功能。将装饰器更改为
@patch('mylib.process.store_info')
def test_process_info(store_info_mock):
...
请参阅stdlib文档中的Where to patch部分。