如何使用aiohttp模拟外部请求?

时间:2019-02-11 14:23:21

标签: python aiohttp

我正在尝试模拟对外部URL的单个请求,但是在文档中仅存在内部请求的示例(以'/'开头),在当前版本中无法添加非以'/'开头的路由器的aiohttp。 我正在使用pytest和pytest-aiohttp,这是请求代码的示例:

import aiohttp
import asyncio

async def fetch(client):
   async with client.get('http://python.org') as resp:
       return resp.status, (await resp.text())

async def main():
   async with aiohttp.ClientSession() as client:
       html = await fetch(client)
       print(html)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

我想要做的断言非常简单,例如检查状态码,标头和内容。

2 个答案:

答案 0 :(得分:0)

您可以(使用asynctest.patch)修补android { . . . defaultConfig { minSdkVersion //your minimum SDK version targetSdkVersion //your target SDK version multiDexEnabled true // this is what you should add } } dependencies { compile 'com.android.support:multidex:1.0.3' } 。但是在这种情况下,您需要使用ClientSession方法和属性来实现简单的ResponseContextManager

答案 1 :(得分:0)

在您的评论中(在您的问题下方),您说您实际上是想模拟 aiohttp 响应。为此,我一直在使用第 3 方库 aioresponseshttps://github.com/pnuckowski/aioresponses

我将它用于集成测试,这似乎比直接模拟或修补 aiohttp 方法更好。

我把它变成了一个像这样的小 pytest 固定装置:

@pytest.fixture
def aiohttp_mock():
    with aioresponses() as aioresponse_mock:
        yield aioresponse_mock

然后我可以像 aiohttp 客户端/会话一样调用它:aiohttp_mock.get(...)