当测试一起运行时,所有测试中使用的外部库模拟补丁不起作用

2024-01-09

我正在使用 Python 的模拟库和单元测试。我正在为一个类编写单元测试,该类在其方法之一中使用外部库的函数。根据情况,该函数返回不同的值。

假设我想测试 A 类:

from external_library import function_foo

class A(object):
...

在我的测试类中,为了使用函数从外部库返回的值,我创建了一个补丁,并且在定义补丁后仅导入类A。但是,我需要在所有测试方法中使用此函数,并且在每个方法中它返回不同的值。

我的测试类如下:

class TestA(TestCase):

    @patch('external_library.function_foo', side_effect=[1, 2, 3])    
    def test_1(self, *patches):

       from module import class A
       obj = A()
       ...

    @patch('external_library.function_foo', side_effect=[1, 1, 2, 2, 3, 3])    
    def test_2(self, *patches):

       from module import class A
       obj = A()
       ...

    ...

我有 10 个测试,当我一起运行所有测试时,只有 1 个(第一个)通过,其余的,我得到StopIteration错误。然而,如果我单独运行它们中的每一个,它们都会通过.

我尝试过使用with patch('external_library.function_foo', side_effect=[...])每种方法,但结果是相同的。我也尝试只创建一次补丁setUp方法,启动它,在每个方法中重新分配 side_effect,然后停止tearDown,但没有成功。

关于在这种情况下可行的任何想法吗?

Thanks!


需要注意的是,第二次导入模块时,它不会再次加载 https://docs.python.org/3/reference/import.html#the-module-cache,您将获得与第一次导入时相同的模块对象。

当您第一次运行“test_1”时,external_library.function_foo替换为Mock对象,让我们命名它mock_a。然后你的“模块”第一次被导入,python将加载它,意味着,执行“模块”内的代码,它将名称“function_foo”绑定到“模块”命名空间中的对象“mock_a”,保存“模块”反对sys.modules。这次你的测试将通过,并且side_effect of mock_a被消耗。

接下来是“test_2”,external_library.function_foo替换为Mock对象,将其命名为mock_b。然后导入“module”,这次不会再次加载,而是从sys.modules,您将获得与“test_1”中相同的模块对象。在此模块对象的命名空间中,名称“function_foo”仍然绑定到对象mock_a,不是新创建的mock_b。因为side_effect of mock_a已经消费了,StopIteration引发错误。

您应该将补丁应用到name被查找,但不是在它定义的地方:

@patch('module.function_foo', side_effect=[1, 2, 3])    
def test_1(self, patch):
    ...

阅读更多详细信息手册的“哪里打补丁”部分patch https://docs.python.org/3/library/unittest.mock.html#where-to-patch.

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

当测试一起运行时,所有测试中使用的外部库模拟补丁不起作用 的相关文章

  • Pandas 字符串提取所有匹配项

    我正在学习 pandas 系列字符串方法中的正则表达式操作 我能够从字符串中提取第一个数字 但我的正则表达式与第二个数字不匹配 如何捕获这两个数字 注意第二行 第二个元素在这里是 NAN CODE import pandas as pd d
  • 使用 Python 在 Google Cloud Storage 存储桶中创建/上传新文件

    如何使用 Python 和可用的客户端库在 Google Cloud Storage 中创建新的空文件 或者如何使用 blob 函数 upload from filename 将新文件上传到选定的存储桶 要初始化 blob 对象 我们应该在
  • pip 安装失败,SSL 证书验证失败 (_ssl.c:833)

    我无法通过 pip install 安装任何外部 python 模块 我已经正确安装了 python 但如果我使用 pip install 它会显示此错误 这是我运行后的代码pip install pytesseract C Users 1
  • 在 Python 中绘制分类数据的三个维度

    我的数据包含三个我试图可视化的分类变量 城市 五个之一 职业 四种之一 血型 四种之一 到目前为止 我已经成功地以一种我认为易于使用的方式对数据进行了分组 import numpy as np pandas as pd Make data
  • 小数缓存是Python规范中定义的还是一个实现细节?

    Python 似乎有一个所谓的 小数字缓存 用于存储 5 到 256 范围内的数字 我们可以使用以下程序来演示这一点 for i in range 7 258 if id i id i 0 print i is cached else pr
  • 检测/删除 Python 2 + GTK 中不成对的代理字符

    在Python 2 7中我可以成功转换Unicode字符串 abc udc34xyz 转换为 UTF 8 结果是 abc xed xb0 xb4xyz 但是当我将 UTF 8 字符串传递给例如时 pango parse markup or
  • 在 vim 折叠线中语法高亮 Python

    我发现代码折叠 http en wikipedia org wiki Code folding帮助我更好地组织我的文件 因此 在我的底部 vimrc 我启用vim代码折叠 http vimdoc sourceforge net htmldo
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 类型错误:需要 Future 或协程

    我尝试在 asyncssh 上自动重新连接 ssh 客户端 SshConnectManager 必须留在后台并在需要时进行 ssh 会话 class SshConnectManager object def init self host u
  • python-polars 通过分隔符将字符串列拆分为许多列

    在 pandas 中 以下代码会将 col1 中的字符串拆分为许多列 有没有办法在极地做到这一点 d col1 a b c d a b c d df pd DataFrame data d df a b c d df col1 str sp
  • 检查多个 pd.DataFrame 是否相等

    是否有一种 Pythonic 方式 无循环或递归 来检查是否超过两个pd DataFrames 例如 pd DataFrames 列表 彼此相等吗 就像是 all x equals dfs 0 for x in dfs with dfs数据
  • 使用 Python 脚本打开特定文件类型?

    如何使 Python 脚本成为特定文件类型 例如 foo 的默认应用程序 例如 当我双击 Finder Explorer 中的文件时 我希望该文件在 Python 脚本中打开 这可以在 Win 和 或 OS X 中实现吗 如果重要的话 该应
  • 如何在 Sublime 2 REPL Mac 中运行 Python 3

    我的问题如下 我安装了 sublime 2 和 sublime repl 插件 一切正常 我唯一需要的是更改在控制台内置的 sublimerepl 上运行的 python 版本 我的意思是 我有 python 2 7 5 预先安装了 mav
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 如何使用 pygame.mixer 重复音乐?

    我创建了以下使用 pygame mixer 播放 mp3 音乐的代码 然而 音乐不会重复 有什么想法可以让音乐重复播放吗 这是代码 playlist list playlist append put music here mp3 playl
  • Scrapy 抓取并跟踪 href 中的链接

    我对 scrapy 很陌生 我需要从 url 的主页跟踪 href 到多个深度 再次在 href 链接内我有多个 href 我需要遵循这些href 直到到达我想要抓取的页面 我的页面的示例 html 是 初始页 div class page
  • Pip 突然使用了错误版本的 Python

    在 os x 上使用 pip 时遇到一个奇怪的问题 据我所知 快速查看我的 bash history 似乎可以确认 我最近没有对我的配置进行任何更改 唉 pip 命令似乎突然使用了与以前不同的 python 版本 到目前为止 我使用命令 p
  • 在Python中从CSV文件中获取随机行并找到相应的单词,就像测验一样

    抱歉标题含糊不清 想不出更好的表达方式 我有一个包含德语 英语单词的 CSV 文件 如下所示 Ja Yes Nein No Katze Cat 我希望我的 python 脚本从 CSV 文件中打印一个随机的德语单词 并要求他们输入英语单词
  • 通过 ManyToManyField = Value 对 django 查询集进行排序

    如果有一些模型 例如 class Tag models Model name models CharField class Thing models Model title models CharField tags models Many
  • django admin 中内联模型的分页器

    我有这个简单的 django 模型 由一个传感器和特定传感器的值组成 每个日射强度计的值数量很多 gt 30k 是否可以以某种方式分页PyranometerValues在特定日期或一般情况下将分页器应用于管理内联视图 class Pyran

随机推荐

  • 如何将用户输入转换为列表[重复]

    这个问题在这里已经有答案了 我想编写一个Python程序 要求用户输入7个数字 该输入应转换为列表并首先显示单个数字 然后显示整个列表 所以我的想法是从 for 循环开始 for a in range 1 8 number int inpu
  • Mobile Safari 文本输入宽度错误?

    看看这些屏幕截图 https i stack imgur com 1TFuj png https i stack imgur com 1TFuj png https i stack imgur com 3fukT png https i s
  • 设置 » JavaScript 的 document.title 中的 HTML 实体?

    我正在设置document title使用 JavaScript 但我找不到提供的方法 raquo 而不显示为文字文本 这是我的代码 document title Home raquo site com 如果我使用 在文档的标题标签中 它工
  • Rails 在控制器中异步执行任务

    当我的路线中有一条路线时 我需要执行三项任务Controller叫做 现在我的代码看起来像这样 缩写 def set quotas TaskOne new ex TaskTwo new ex TaskThree new ex quotas
  • 如何将svn分支和标签导入git-svn?

    我有一个必须提交的中央 SVN 存储库 但我对 git 充满热情 就像我认识的任何其他开发人员一样 此案众所周知 然后我读到了 git svn 并尝试了一下 由于我不需要完整的历史记录 只需要两个月左右的时间 我确实喜欢这样 git svn
  • 如何使用 OpenCv 查找图像上的角点

    我正在尝试找到图像上的角点 我不需要轮廓 只需要 4 个角点 我将使用 4 个角来改变视角 我正在使用 Opencv 但我需要知道找到角点的步骤以及我将使用什么函数 My images will be like this without r
  • 检查 Android 设备上的 NFC 功能

    这是为了回应question https stackoverflow com questions 5805034 detecting nfc on android devices Step 1 Put this in your manife
  • Z3 对指数的支持

    我是 Z3 的新手 我试图了解它是如何工作的 以及它能做什么和不能做什么 我知道Z3至少有some通过幂 运算符支持指数 请参阅Z3py 使用 pow 函数返回未知方程 https stackoverflow com questions 3
  • 如何使用 Java 计算 Selenium WebDriver 中的 HTML 子标签数量

    在 Selenium JAVA WebDriver 中 如何计算子标签 例子 div class subcategory container div class products container div class product ro
  • MongoDB - 多对多关系?

    我很好奇如何构建一个具有多对多关系 可能有数万条记录的 MongoDB 假设您有一个餐厅数据库 可以跟踪大量餐厅以及所有入住过这些餐厅的人 因此 用户可能想要查找一个人并查看他们已签到的所有餐厅 而且还想查找一家餐厅并查看所有已签到的人 如
  • “react-native弹出”:无法识别的命令“弹出”

    我正在尝试为我的反应本机项目重新创建 ios 和 android 文件夹 据我所知 这是通过以下命令完成的 react native eject 但我收到错误 error Unrecognized command eject 我做错了什么吗
  • 从 ItemDataBound 事件中的转发器控件获取值

    如何在 ItemDataBound 事件中获取转发器控件的值 我写了下面的asp代码
  • 处理推文时使用 JSON 或正则表达式

    哪种方法更快 使用 JSON 解析器 python 2 6 或正则表达式来获取相关数据 由于数据量巨大 我认为使用一种方法与其他方法相比在时间上会有很大差异 假设你在问什么 我相信您会问 通过反序列化序列化 JSON 字符串或通过正则表达式
  • 返回 R 中别名系数的 VIF

    我想知道是否有人可以帮助我解决以下问题 当我在各种解释变量之间进行 VIF 分析时 会出现以下错误消息 test lt vif lm Spring Autumn Oct Nov Dec Jan Feb Mar Apr May Jun Jul
  • 重写 HashSet 的 Contains 方法

    有人能告诉我如何重写 HashSet 的 contains 方法以使用正则表达式匹配而不是仅使用 equals 吗 或者 如果不覆盖 我如何添加一个方法来使用正则表达式模式 基本上 我希望能够在包含字符串的 HashSet 上运行正则表达式
  • C# - 使用 HTMLAgilityPack 获取 JavaScript 变量值

    我目前有 2 个 JavaScript 变量 需要从中检索值 HTML 由一系列没有 id name 属性的嵌套 DIV 组成 是否可以使用 HTMLAgilityPack 从这些变量中检索数据 如果是这样 我将如何去做 如果不是需要什么
  • 如何在magento中添加密件抄送或抄送

    我不知道如何在以下编码中添加抄送或密件抄送 我尝试了密件抄送 但邮件无法发送 请有人帮忙 代码是 data array name gt username to user id gt to userid email gt email tele
  • 在 MyEclipse 中开发 Maven 战争应用程序值得吗?

    我的组织已做出上层决定 将 Maven 作为 Java 项目的标准构建工具 我的任务是帮助我们的本地团队将项目迁移到 Maven MyEclipse IDE 是正在发挥作用的核心工具之一 MyEclipse 似乎与 Maven 团队有着一段
  • 蟒蛇熊猫。日期对象由单独的列分割。

    我在Python pandas 中将日期写为 1 31 2010 为了应用线性回归 我想要 3 个单独的变量 天数 月数 年数 将 pandas 中包含日期的列分成 3 列的方法是什么 另一个问题是将天数相同但分为 3 组 1 10 11
  • 当测试一起运行时,所有测试中使用的外部库模拟补丁不起作用

    我正在使用 Python 的模拟库和单元测试 我正在为一个类编写单元测试 该类在其方法之一中使用外部库的函数 根据情况 该函数返回不同的值 假设我想测试 A 类 from external library import function f