首页 > 解决方案 > 模拟请求时如何从aiohttp中的路由获取动态路径参数?

问题描述

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

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中的路径检索动态值的正确方法是什么?

标签: pythonpython-3.xmockingpytestaiohttp

解决方案


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']

附言

一般来说,我想警告模拟过度使用。通常,功能测试aiohttp_client容易阅读和维护。

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


推荐阅读