模拟请求时如何从aiohttp中的路由获取动态路径参数?

How to get dynamic path params from route in aiohttp when mocking the request?

使用下面的路由定义,我试图从 aiohttp 中的 URL 中提取 book_id

from aiohttp import web
routes = web.RouteTableDef()

@routes.get('/books/{book_id}')
async def get_book_pages(request: web.Request) -> web.Response:
    book_id = request.match_info.get('book_id', None)

    return web.json_response({'book_id': book_id})

下面是我写的测试(使用pytest)

import asynctest
import pytest
import json

async def test_get_book() -> None:
    request = make_mocked_request('GET', '/books/1')
    response = await get_book(request)
    assert 200 == response.status
    body = json.loads(response.body)
    assert 1 == body['book_id']

测试结果:

None != 1

Expected :1
Actual   :None

在测试之外,当我 运行 向 /books/1 发出请求时,响应是 {'book_id': 1}

模拟请求时从 aiohttp 中的路径检索动态值的正确方法是什么?

make_mocked_request() 对应用程序及其路由一无所知。

要传递动态信息,您需要提供自定义 match_info 对象:

async def test_get_book() -> None:
    request = make_mocked_request('GET', '/books/1', 
                                         match_info={'book_id': '1'})
    response = await get_book(request)
    assert 200 == response.status
    body = json.loads(response.body)
    assert 1 == body['book_id']

P.S.

总的来说,我想警告模拟过度使用。通常,functional testingaiohttp_client 更易于阅读和维护。

我更喜欢模拟网络错误模拟等真正难以休息的事情。 否则你的测试会测试你自己的模拟,而不是真正的代码。