模拟请求时如何从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 testing 和 aiohttp_client
更易于阅读和维护。
我更喜欢模拟网络错误模拟等真正难以休息的事情。
否则你的测试会测试你自己的模拟,而不是真正的代码。
使用下面的路由定义,我试图从 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 testing 和 aiohttp_client
更易于阅读和维护。
我更喜欢模拟网络错误模拟等真正难以休息的事情。 否则你的测试会测试你自己的模拟,而不是真正的代码。