如何为循环调用requests.get的函数编写测试并按URL定制返回值
如何根据URL动态Mock requests.get的返回值
你可以通过unittest.mock.patch结合side_effect来实现——side_effect允许你定义一个自定义函数,根据requests.get的输入参数(这里就是URL)返回对应的模拟响应。
示例实现步骤
- 原业务函数(假设你的代码结构如下):
import requests def fetch_multiple_urls(urls): results = [] for url in urls: resp = requests.get(url) results.append({"url": url, "content": resp.text, "status": resp.status_code}) return results
- Mock测试代码:
from unittest.mock import patch, Mock def mock_requests_get(url): # 定义URL与返回内容的映射关系 url_response_map = { "https://example.com": {"text": "示例网站内容", "status": 200}, "https://test-api.com/data": {"text": '{"id": 1, "name": "test"}', "status": 200}, "https://invalid-url.com": {"text": "404 Not Found", "status": 404} } # 创建模拟的Response对象 mock_resp = Mock() # 根据URL获取对应配置,无匹配则返回默认404 resp_config = url_response_map.get(url, {"text": "Unknown URL", "status": 404}) mock_resp.text = resp_config["text"] mock_resp.status_code = resp_config["status"] return mock_resp def test_fetch_multiple_urls(): test_url_list = [ "https://example.com", "https://test-api.com/data", "https://invalid-url.com" ] # 使用patch替换requests.get,指定side_effect为自定义函数 with patch("requests.get", side_effect=mock_requests_get): results = fetch_multiple_urls(test_url_list) # 验证结果是否符合预期 assert results[0]["content"] == "示例网站内容" assert results[1]["status"] == 200 assert results[2]["status"] == 404
关键说明
side_effect会接收被Mock函数的所有输入参数,因此mock_requests_get可以直接拿到调用时传入的URL。- 用字典映射URL和响应配置,比多个
if-elif分支更简洁易维护。 - 通过
Mock()创建模拟的requests.Response对象,设置text、status_code等属性来模拟真实响应的行为。
内容的提问来源于stack exchange,提问作者Shreyas Taware
相关产品推荐
相关产品推荐

