python - python响应库将部分URL添加到请求参数
问题描述
我正在尝试使用响应库来模拟外部 API。我想检查我是否在我的请求中正确传递了我的参数,所以我使用响应文档中的这个最小工作示例:
import responses
import requests
@responses.activate
def test_request_params():
responses.add(
method=responses.GET,
url="http://example.com?hello=world",
body="test",
match_querystring=False,
)
resp = requests.get('http://example.com', params={"hello": "world"})
assert responses.calls[0].request.params == {"hello": "world"}
问题是,一旦我用http://example.com
类似于 API 端点的 URL 替换,这就会中断:
@responses.activate
def test_request_params():
responses.add(
method=responses.GET,
url="http://example.com/api/endpoint?hello=world",
body="test",
match_querystring=False,
)
resp = requests.get('http://example.com/api/endpoint', params={"hello": "world"})
assert responses.calls[0].request.params == {"hello": "world"}
现在响应已将部分 URL 添加到第一个查询参数中:
> assert responses.calls[0].request.params == {"hello": "world"}
E AssertionError: assert {'/api/endpoint?hello': 'world'} == {'hello': 'world'}
我错过了什么吗?
解决方案
您可以将正则表达式作为 url 参数传递,它会忽略参数:
@responses.activate
def test_request_params():
url = r"http://example.com/api/endpoint"
params = {"hello": "world", "a": "b"}
# regex that matches the url and ignores anything that comes after
rx = re.compile(rf"{url}*")
responses.add(method=responses.GET, url=rx)
response = requests.get(url, params=params)
assert responses.calls[-1].request.params == params
url_path, *queries = responses.calls[-1].request.url.split("?")
assert url_path == url
推荐阅读
- ansible - 在不需要的服务器中运行的 Ansible 剧本
- android - 在片段中调用方法
- php - 无法使用 php 7.3 在 ubuntu 19.10 上安装 php-intl 扩展
- automation - 自动创建 Power Bi 报告>
- cisco - % Cisco 中的无效接口类型和编号我的 vlan 是 22 23 和 24
- ruby-on-rails - Rails form_for 具有相同属性的嵌套和关联资源已填充文本
- python - 新闻在数据框中抓取多个网址
- sql - 如何在 Redshift 的数据库中创建表?
- python - 检查字符串中是否存在两个子字符串中的任何一个
- algorithm - 迪杰斯特拉检查站