python - 模拟请求时如何从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中的路径检索动态值的正确方法是什么?
解决方案
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
容易阅读和维护。
我更喜欢模拟网络错误模拟等非常难以解决的事情。否则,您的测试会测试您自己的模拟,而不是真正的代码。
推荐阅读
- android - Lib 内部的房间持久性
- css - Angular 4在按钮悬停时添加过渡
- ruby-on-rails - Websocket 服务器 On Rails - 仅限客户端
- c# - Active Directory:MSAL (UWP) PublicClientApplication.AcquireTokenAsync(...) 返回异常
- javascript - 如何将图像地图区域 ID 发送到 php 文件?
- eclipse - birt 报告列在导出到 excel 时自动调整大小
- amazon-web-services - 带有 Unauth 角色的 AWS/Cognito/IAM 错误
- python-3.x - 为什么 asyncio 被 processPool 阻塞?
- redmine - 组中的 Redmine API 用户
- html - External CSS is not working in NodeJS