【发布时间】:2023-07-03 00:53:01
【问题描述】:
我想模拟一个函数,该函数使用在上下文管理器中创建的requests.Session 对象来执行get 请求,再次使用上下文管理器。因此涉及到两个上下文管理器。
这是一个示例代码:
# main.py
from requests import Session
def fun(session):
with session.get("https://httpstat.us/200") as response:
print(response)
def run():
with Session() as session:
fun(session)
if __name__ == "__main__":
run()
执行时,200 的状态码按预期打印。
现在我想模拟 get 请求,以返回不同的值。不知何故,我无法在混乱的上下文管理器和返回值中导航。
这是我的最大努力:
# maintest.py
from unittest.mock import patch
from main import run
def test_main():
with patch("main.Session") as mocked_session:
mocked_session.__enter__.return_value.get.__enter__.return_value = "MOCKED"
run()
使用 pytest 运行测试,我希望打印出 "MOCKED",但结果却得到了
<MagicMock name='Session().__enter__().get().__enter__()' id='140303100714240'>
我尝试了__enter__、.get 和.return_value 的任何可能组合
【问题讨论】:
-
main中没有对requests的单独引用(仅当您使用from...import时才会发生这种情况),因此您必须修补"requests.Session"而不是"main.requests.Session"。 -
谢谢@MrBean Bremen。如果我在
main中更改为from requests import Session怎么办? -
在这种情况下,您将修补
"main.Session"。 -
谢谢@MrBeanBremen,我已经实现了你的建议。不过,我似乎无法获得
get的返回值。 -
好的,我添加了一个答案来阐明正确代码的外观 - 太复杂了,无法评论...
标签: python python-requests mocking python-unittest