gpt4 book ai didi

python - 模拟功能导入到许多位置

转载 作者:行者123 更新时间:2023-12-05 03:21:56 27 4
gpt4 key购买 nike

我想在每个导入的地方模拟一个函数。

例子

说我有

# foo.py

def send_email():
call_email_service()
# bar1.py
from foo import send_email

def my_func():
...
send_email()

和许多其他使用 send_email 的文件。我想要一个 fixture 来模拟 send_email 的所有用法。

当前最佳方案

尝试修补 'foo.send_email' 不起作用,因为您需要修补它所使用的 namespace (即,我必须修补 'bar1.send_email')。

我的最佳解决方案是像这样重写代码:

# foo.py

def send_email():
_send_email_mockable()

def _send_email_mockable():
call_email_service()

并编写一个 fixture ,如:

@pytest.fixture(autouse=True)
def _mock_email_service():
with patch('foo._send_email_mockable', autospec=True):
yield

这确实有效,但如果可能的话,我希望测试逻辑不要潜入我的主要逻辑,如果 send_email 有一个复杂的函数签名,我必须重复它两次。

最佳答案

将您的导入语句更改为以下内容:

# bar1.py

# Previous way
from foo import send_email

# New way
import foo

def my_func():
...
foo.send_email()

这将允许 mock 在将 send_email 加载到目标文件之前修补 foo 命名空间。

关于python - 模拟功能导入到许多位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72862873/

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