gpt4 book ai didi

python - 修补包内的函数 __init__ 并在同一包内的模块中使用它

转载 作者:行者123 更新时间:2023-11-28 18:01:03 25 4
gpt4 key购买 nike

我正在尝试修补 __init__.py 中定义的内部包函数,该函数正被同一包内模块内的函数使用。我面临的问题是它没有得到修补。

当我更改使用需要修补为绝对导入的函数的模块内部的导入语句时,我取得了一些成功。问题是我不想要绝对导入,那样重构代码会很痛苦。

我的测试设置的结构是:

|- 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 这样的导入语句,测试通过适当的补丁模拟。使用像 from 这样的语句。 import store_data 该函数未被修补。

是否有可能使用相对导入并仍然能够在同一个包中修补函数?如果是这样,什么是好的做法?

最佳答案

您正在为声明的函数打补丁;相反,您应该在实际使用的地方修补函数。将装饰器更改为

@patch('mylib.process.store_info')
def test_process_info(store_info_mock):
...

参见 Where to patch stdlib 文档的部分。

关于python - 修补包内的函数 __init__ 并在同一包内的模块中使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55723133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com