requests-mock:如何匹配模拟端点中发布的有效负载

mfo*_*ism 5 python pytest python-requests requests-mock

我做了什么

我编写了一个身份验证类,用于使用应用程序的API 密钥及其API 密钥机密从 Twitter获取应用程序的不记名令牌,如Twitter 开发人员文档中所示。

我使用这种方式模拟了适当的端点requests_mock

@pytest.fixture
def mock_post_bearer_token_endpoint(
    requests_mock, basic_auth_string, bearer_token
):
    requests_mock.post(
        "https://api.twitter.com/oauth2/token",
        request_headers={
            "Authorization": f"Basic {basic_auth_string}",
            "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
        },
        json={"token_type": "bearer", "access_token": f"{bearer_token}"},
    )
Run Code Online (Sandbox Code Playgroud)

我的测试方法是:

@pytest.mark.usefixtures("mock_post_bearer_token_endpoint")
def test_basic_auth(api_key, api_key_secret, bearer_token):
    response = requests.post(
        'https://api.twitter.com/oauth2/token',
        data={"grant_type": "client_credentials"},
        auth=TwitterBasicAuth(api_key, api_key_secret),
    )
    assert response.json()['access_token'] == bearer_token
Run Code Online (Sandbox Code Playgroud)

TwitterBasicAuth我编写的身份验证类在哪里,固定装置basic_auth_string是一个硬编码的字符串,可以通过适当地转换固定装置来获得api_keyapi_key_secret

它有效。

问题

但我确实对模拟端点不检查有效负载这一事实感到困扰。在这种特殊情况下,有效负载对于获取不记名令牌至关重要。

requests_mock我已经梳理了(以及)的文档responses,但还没有弄清楚如何使端点仅在发布正确的有效负载时才使用不记名令牌进行响应。

请帮忙。

jam*_*nox 4

我认为这里的误解是您需要将所有内容放入匹配器中,并让 NoMatchException 来告诉您是否正确。

匹配器可以是返回正确响应所需的最简单的东西,然后您可以将所有请求/响应检查作为正常单元测试处理的一部分。

例如,如果您需要根据请求正文切换响应值,additional_matchers 很有用,通常 true/false 就足够了。

例如,我没有尝试为此查找 twitter auth:

import requests
import requests_mock

class TwitterBasicAuth(requests.auth.AuthBase):

    def __init__(self, api_key, api_key_secret):
        self.api_key = api_key
        self.api_key_secret = api_key_secret

    def __call__(self, r):
        r.headers['x-api-key'] = self.api_key
        r.headers['x-api-key-secret'] = self.api_key_secret
        return r


with requests_mock.mock() as m:
    api_key = 'test'
    api_key_secret = 'val'

    m.post(
        "https://api.twitter.com/oauth2/token",
        json={"token_type": "bearer", "access_token": "token"},
    )

    response = requests.post(
        'https://api.twitter.com/oauth2/token',
        data={"grant_type": "client_credentials"},
        auth=TwitterBasicAuth(api_key, api_key_secret),
    )

    assert response.json()['token_type'] == "bearer"
    assert response.json()['access_token'] == "token"
    assert m.last_request.headers['x-api-key'] == api_key
    assert m.last_request.headers['x-api-key-secret'] == api_key_secret
Run Code Online (Sandbox Code Playgroud)

https://requests-mock.readthedocs.io/en/latest/history.html