使用unittest.mock.patch测试aiohttp客户端

2024-01-04

我使用 aiohttp 编写了一个简单的 HTTP 客户端,并尝试通过修补来测试它aiohttp.ClientSession and aiohttp.ClientResponse。然而,看起来好像unittest.mock.patch装饰器不尊重我的异步代码。据猜测,我会说这是某种命名空间不匹配。

这是一个最小的例子:

from aiohttp import ClientSession

async def is_ok(url:str) -> bool:
    async with ClientSession() as session:
        async with session.request("GET", url) as response:
            return (response.status == 200)

我正在使用异步装饰器进行测试,如中所述这个答案 https://stackoverflow.com/a/23036785/876937。这是我尝试的测试:

import unittest
from unittest.mock import MagicMock, patch

from aiohttp import ClientResponse

from my.original.module import is_ok

class TestClient(unittest.TestCase):
    @async_test
    @patch("my.original.module.ClientSession", spec=True)
    async def test_client(self, mock_client):
        mock_response = MagicMock(spec=ClientResponse)
        mock_response.status = 200

        async def _mock_request(*args, **kwargs):
            return mock_response

        mock_client.request = mock_response

        status = await is_ok("foo")
        self.assertTrue(status)

My is_ok协程在使用时工作得很好,比如说,__main__,但是当我运行测试时,它给我一个错误,表明session.request根据我的说法,函数没有被嘲笑patch称呼。 (具体来说,它说“无法从 URL 'foo' 解析主机名”,如果它weren't嘲笑。)

我无法逃避这种行为。我努力了:

  • 输入is_ok嘲笑完成后。
  • 分配模拟的各种组合mock_client and mock_client.__aenter__, 环境mock_client.request to MagicMock(return_value=mock_response),或使用mock_client().request, etc.
  • 写一个模拟ClientSession与具体的__aenter__ and __aexit__方法并在其中使用它new论证patch.

这些似乎都没有什么区别。如果我将断言放入is_ok测试一下ClientSession是一个实例MagicMock,那么当我运行测试时这些断言会失败(同样,当代码未修补时它们也会失败)。这引出了我的命名空间不匹配理论:也就是说,事件循环在不同的命名空间中运行patch正在瞄准。

要么是这样,要么我正在做一些愚蠢的事情!


Mocking ClientSession感到气馁。

推荐的方式是创建假服务器并发送real向其提出请求。

看看aiohttp 示例 https://github.com/aio-libs/aiohttp/blob/master/examples/fake_server.py.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用unittest.mock.patch测试aiohttp客户端 的相关文章

  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • 如何用python脚本控制TP LINK路由器

    我想知道是否有一个工具可以让我连接到路由器并关闭它 然后从 python 脚本重新启动它 我知道如果我写 import os os system ssh l root 192 168 2 1 我可以通过 python 连接到我的路由器 但是
  • 用枢轴点拟合曲线 Python

    我有下面的图 我想用 2 条线来拟合它 使用 python 我设法适应上半部分 def func x a b x np array x return a x b popt pcov curve fit func up x up y 我想用另
  • 删除flask中的一对一关系

    我目前正在使用 Flask 开发一个应用程序 并且在删除一对一关系中的项目时遇到了一个大问题 我的模型中有以下结构 class User db Model tablename user user id db Column db String
  • 使用 kivy textinput 的 'input_type' 属性的问题

    您好 我在使用 kivy 的文本输入小部件的 input type 属性时遇到问题 问题是我制作了两个自定义文本输入 其中一个称为 StrText 其中设置了 input type text 然后是第二个文本输入 名为 NumText 其
  • 您可以格式化 pandas 整数以进行显示,例如浮点数的“pd.options.display.float_format”?

    我见过this https stackoverflow com questions 18404946 py pandas formatdataframe and this https stackoverflow com questions
  • 立体太阳图 matplotlib 极坐标图 python

    我正在尝试创建一个与以下类似的简单的立体太阳路径图 http wiki naturalfrequent com wiki Sun Path Diagram http wiki naturalfrequency com wiki Sun Pa
  • 为什么 PyYAML 花费这么多时间来解析 YAML 文件?

    我正在解析一个大约 6500 行的 YAML 文件 格式如下 foo1 bar1 blah name john age 123 metadata whatever1 whatever whatever2 whatever stuff thi
  • Python 2:SMTPServerDisconnected:连接意外关闭

    我在用 Python 发送电子邮件时遇到一个小问题 me my email address you recipient s email address me email protected cdn cgi l email protectio
  • 如何使用python在一个文件中写入多行

    如果我知道要写多少行 我就知道如何将多行写入一个文件 但是 当我想写多行时 问题就出现了 但是 我不知道它们会是多少 我正在开发一个应用程序 它从网站上抓取并将结果的链接存储在文本文件中 但是 我们不知道它会回复多少行 我的代码现在如下 r
  • 如何通过索引列表从 dask 数据框中选择数据?

    我想根据索引列表从 dask 数据框中选择行 我怎样才能做到这一点 Example 假设我有以下 dask 数据框 dict A 1 2 3 4 5 6 7 B 2 3 4 5 6 7 8 index x1 a2 x3 c4 x5 y6 x
  • 如何使用 pybrain 黑盒优化训练神经网络来处理监督数据集?

    我玩了一下 pybrain 了解如何生成具有自定义架构的神经网络 并使用反向传播算法将它们训练为监督数据集 然而 我对优化算法以及任务 学习代理和环境的概念感到困惑 例如 我将如何实现一个神经网络 例如 1 以使用 pybrain 遗传算法
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • pip 列出活动 virtualenv 中的全局包

    将 pip 从 1 4 x 升级到 1 5 后pip freeze输出我的全局安装 系统 软件包的列表 而不是我的 virtualenv 中安装的软件包的列表 我尝试再次降级到 1 4 但这并不能解决我的问题 这有点类似于这个问题 http
  • 从 NumPy ndarray 中选择行

    我只想从 a 中选择某些行NumPy http en wikipedia org wiki NumPy基于第二列中的值的数组 例如 此测试数组的第二列包含从 1 到 10 的整数 gt gt gt test numpy array nump
  • 仅第一个加载的 Django 站点有效

    我最近向 stackoverflow 提交了一个问题 标题为使用mod wsgi在apache上多次请求后Django无限加载 https stackoverflow com questions 71705909 django infini
  • python import inside函数隐藏现有变量

    我在我正在处理的多子模块项目中遇到了一个奇怪的 UnboundLocalError 分配之前引用的局部变量 问题 并将其精简为这个片段 使用标准库中的日志记录模块 import logging def foo logging info fo
  • 如何计算Python中字典中最常见的前10个值

    我对 python 和一般编程都很陌生 所以请友善 我正在尝试分析包含音乐信息的 csv 文件并返回最常听的前 n 个乐队 从下面的代码中 每听一首歌曲都是一个列表中的字典条目 格式如下 album Exile on Main Street
  • cv2.VideoWriter:请求一个元组作为 Size 参数,然后拒绝它

    我正在使用 OpenCV 4 0 和 Python 3 7 创建延时视频 构造 VideoWriter 对象时 文档表示 Size 参数应该是一个元组 当我给它一个元组时 它拒绝它 当我尝试用其他东西替换它时 它不会接受它 因为它说参数不是

随机推荐

  • 将小数格式化为正确的区域性信息中的字符串

    将小数金额格式化为字符串以便 UI 以正确的区域性信息显示的最佳方法是什么 向 ToString 添加格式 myDecimal ToString 00 or myDecimal ToString C 对于可为空的小数 decimal 您将需
  • 为什么 CMake 找不到 GTest(Google 测试)?

    有一个现成的项目 在其中一个 cmake 文件中有一个源代码 find package GTest REQUIRED if NOT GTest FOUND message FATAL ERROR Cannot find Google Tes
  • CKAN可以支持Solr 7.0吗?

    我正在尝试在 Ubuntu 16 04 中安装 Solr 7 0 和 CKAN 2 7 2 但是 我得到了以下内容errors 来自 Solr 管理网站 ckan org apache solr common SolrException o
  • 查找图中的最长路径

    我一直在努力找出复杂网络中最长的路径 我在 StackOverflow 和 Internet 上遇到了很多问题 但没有一个可以帮助我 我写了一个 CQL 作为 start n node match p n LinkTo 1 gt m wit
  • Lucene SpanNearQuery 中“Slop”的确切含义(或 ElasticSearch span_near 中的 slop)

    问题一 问题一
  • 如何判断 CSS 背景图像何时加载?事件被触发了吗? [复制]

    这个问题在这里已经有答案了 我有一个带有图像背景的侧边栏小部件 上面是一个搜索输入表单 我不希望在图像加载之前显示输入 有没有办法附加一个load像普通 img 元素 对象一样 CSS 背景图像的事件处理程序 我知道这可以在普通图像上完成
  • 嵌套循环和字符串连接的性能问题

    有人可以解释一下为什么这段代码需要这么长时间才能运行 即 gt 24 小时 行数为 5000 列数为 2000 即大约 10m 循环 有一个更好的方法吗 for int i 0 i lt m rows i for int j 0 j lt
  • 使用 Akka Stream 传输巨大的 json

    我有一个 json 板的巨大 http 响应问题 其中只有部分是感兴趣的 我无法更改响应结构 这是一个例子 searchString search redirectUrl 0 numRecords 123 refinementViewMod
  • 由多个用户编辑数据库记录

    我设计了数据库表 标准化 在 MS SQL 服务器上 并为应用程序创建了一个独立的 Windows 前端 少数用户将使用该前端来添加和编辑信息 我们将添加一个网络界面 以便稍后在我们的生产区域进行搜索 我担心如果两个用户开始编辑同一条记录
  • 速度模板 - 新线

    我一直在使用 Apache 的 Velocity 引擎和自定义模板 问题是 我无法生成具有相应换行符的字符串 我几乎尝试了我发现的所有内容 例如使用 esc n 和 esc newline 我已经在我的项目中使用转义工具 但似乎我当前使用的
  • 如何在 C++ 中实现对私有基类的强制转换

    如何在 C 中实现对私有基类的强制转换 我不想使用黑客 例如添加朋友等 定义公共转换运算符不起作用 EDIT 例如我有 class A base class class AX private A a child class AY priva
  • PHP变量插值与串联[重复]

    这个问题在这里已经有答案了 以下两种方法 性能 可读性等 有什么区别 您更喜欢哪一种 echo Welcome name s vs echo Welcome name 无论什么对你最有效 都有效 但如果你想追求速度 请使用以下命令 echo
  • 魔术方法(__get,__set)在扩展类中不起作用? [复制]

    这个问题在这里已经有答案了
  • chrome.downloads.download 无法从后台服务人员工作

    我正在尝试创建一个 Chrome 扩展 当单击工具栏按钮时 它将对页面内容进行一些分析 然后将结果保存 即下载 到用户的计算机上 单击按钮时我可以进行分析 但无法触发下载 这是我第一次编写 Chrome 扩展程序 因此任何帮助解决它不起作用
  • Xcode 7:断点停止时崩溃

    我有一个非常烦人的问题 当 Xcode 7 尝试进行符号化时 几乎在每个断点处都会崩溃 我已经做了几件事 包括删除 Xcode 并重新安装它 我在以前的 Xcode 6 X 上也遇到了同样的问题 有什么线索吗 我想知道我是否应该从头开始重新
  • Electron:如何捕获主进程的所有请求响应?

    我想从主进程中获取电子应用程序中发生的所有请求的响应 此图显示我想要获得的响应位于 响应 选项卡 而不是 Chrome 开发工具上的 标头 选项卡 https i stack imgur com AYA1G png 我没有使用
  • Hadoop 如何执行输入拆分?

    这是一个涉及Hadoop HDFS的概念问题 假设您有一个包含 10 亿行的文件 为了简单起见 让我们考虑每行的形式
  • 将网格内的数字转换为其相应的 x,y 坐标

    给定以下网格中的数字 从 1 到 36 如何确定它们在网格内的坐标 x y 0 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 9 1 10 11 12 13 14 15 16 17 18 2 19 20 21 22 2
  • 在 Ruby 中,是否有结合“select”和“map”的数组方法?

    我有一个包含一些字符串值的 Ruby 数组 我需要 查找与某个谓词匹配的所有元素 通过转换运行匹配元素 以数组形式返回结果 现在我的解决方案如下所示 def example matchingLines lines select line r
  • 使用unittest.mock.patch测试aiohttp客户端

    我使用 aiohttp 编写了一个简单的 HTTP 客户端 并尝试通过修补来测试它aiohttp ClientSession and aiohttp ClientResponse 然而 看起来好像unittest mock patch装饰器