使用和不使用 pytest-mock 来模拟标准库函数

2023-12-04

出于测试目的,我想模拟 Shutil.which (Python 3.5.1),它在简化方法 find_foo() 中调用

def _find_foo(self) -> Path:
foo_exe = which('foo', path=None)
if foo_exe:
    return Path(foo_exe)
else:
    return None

我正在使用 pytest 来实现我的测试用例。因此,我还想使用 pytest 扩展 pytest-mock。下面我使用 pytest + pytest-mock 粘贴了一个示例测试用例:

def test_find_foo(mocker):
    mocker.patch('shutil.which', return_value = '/path/foo.exe')

    foo_path = find_foo()
    assert foo_path is '/path/foo.exe'

这种使用 pytest-mock 进行模拟的方式不起作用。 Shutil.which 仍然被调用而不是模拟。

我尝试直接使用mock包,它现在是Python3的一部分:

def test_find_foo():
    with unittest.mock.patch('shutil.which') as patched_which:
        patched_which.return_value = '/path/foo.exe'

        foo_path = find_foo()
        assert foo_path is '/path/foo.exe'

遗憾的是结果是一样的。还shutil.which()被调用而不是指定的模拟。

在我的测试用例中,成功实现模拟的哪些步骤是错误的或遗漏的?


我研究了更多时间学习unittest.mock和pytest-mock。我找到了一个简单的解决方案,无需使用补丁装饰器修改生产代码。下面我粘贴了一个代码片段,演示了 pytest-mock 的第三种方法:

def test_find_foo(mocker):
    mocker.patch('__main__.which', return_value='/path/foo.exe')

    foo_path = find_foo()
    assert foo_path == Path('/path/foo.exe')

如果没有 pytest-mock (普通的 unittest-mock 和 @patch 装饰器),这个解决方案也可以工作。上面代码片段中重要的一行是

mocker.patch('__main__.which', return_value='/path/foo.exe')

补丁装饰器期望name将从被测系统调用的函数的(完整路径)。这在模拟文档。下面的段落总结了补丁装饰器的这一原理:

补丁的工作原理是(暂时)将一个名称指向的对象更改为另一个名称所指向的对象。可以有许多名称指向任何单个对象,因此为了使修补工作正常进行,您必须确保修补被测试系统使用的名称。

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

使用和不使用 pytest-mock 来模拟标准库函数 的相关文章

  • 有什么好的适用于 Google App Engine 应用程序的 AJAX 框架吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试在我的 Google App Engine 应用程序中实现 AJAX 因此我正在寻找一个好的
  • 我可以在 matplotlib 中的绘图左侧放置一个垂直颜色条吗?

    来自颜色条方法的 matplotlib 命令摘要 http matplotlib org api pyplot api html highlight colorbar matplotlib pyplot colorbar我知道关键字参数or
  • 如何在Python + Selenium中获取元素的值

    我在我的 Python 3 6 3 代码中得到了这个 HTML 元素 作为 Selenium网页元素当然 span class ocenaCzastkowa masterTooltip style color 000000 alt 5 sp
  • 如何在plotly(python)中的刻度标签和图形之间添加空格?

    如果我使用绘图创建水平条形图 则每个条形的标签都与图表相对应 我想在标签和图表之间添加一些空间 填充 边距 我怎样才能做到这一点 Example import plotly offline as py import plotly graph
  • Python 中“is”运算符的语义是什么?

    如何is运算符确定两个对象是否相同 它是如何工作的 我找不到它的记录 来自文档 http docs python org reference datamodel html 每个对象都有一个身份 一个类型 和一个值 对象的身份 一旦发生就永远
  • 如何在Python中手动对数字列表进行排序?

    规格 Ubuntu 13 04 Python 3 3 1 背景 Python的初学者 遇到了这个 手动排序 问题 我被要求做的事情 让用户输入 3 个数值并将它们存储在 3 个不同的变量中 不使用列表或排序算法 手动将这 3 个数字从小到大
  • 尝试校准keras模型

    我正在尝试通过 Sklearn 实现来校准我的 CNN 模型CalibratedClassifierCV 尝试将其包装为KerasClassifier并覆盖预测功能但没有成功 有人可以说我做错了什么吗 这是模型代码 def create m
  • 提高光线追踪命中功能的性能

    我有一个简单的 python 光线追踪器 渲染 200x200 的图像需要 4 分钟 这对于我的口味来说绝对是太多了 我想改善这种情况 几点 我为每个像素发射多条光线 以提供抗锯齿功能 每个像素总共发射 16 条光线 200x200x16
  • matplotlib vlines 图中未应用 y 轴的最小值

    我正在 matplotlib 中绘制 vlines 图 数据集中的所有 y 值如下 gt 0 我希望 y 轴最底部的刻度能够读取0 但相反 我得到 500 这是代码 usr bin env python import numpy as np
  • Pygame:有人可以帮我实现双跳吗?

    我知道已经有其他关于此问题的帖子了 但我的运动系统与我发现的有点不同 所以随后我问这个问题 我的运动系统基于一个名为的命名元组Move up left right down 然后就是这个 def update self move block
  • TestMethod:异步任务 TestSth() 不适用于 .NET 4.0

    我正在尝试使用 NET 4 0 BCL Async 和 MsTest 运行异步测试方法 看来这个设置不能处理 测试方法 异步Task测试Sth 由于测试用例资源管理器中缺少条目 将签名更改为异步后void 我可以运行测试用例 但结果错误 根
  • 在python中使用编解码器utf-8打开文件错误

    我在 windows xp 和 python 2 6 4 上执行以下代码 但它显示 IOError 如何打开名称带有 utf 8 编解码器的文件 gt gt gt open unicode txt euc kr encode utf 8 T
  • 将 str.contains 映射到 pandas DataFrame

    python 初学者 我正在寻找创建字符串的字典映射以及关联的值 我有一个数据框 想要创建一个新列 如果字符串匹配 则会将该列标记为 x df pd DataFrame comp dell notebook dell notebook S3
  • 解析整数集的字符串并列出间隔

    I have 2 5 7 9 12 string 我想从中获取 2 5 7 8 9 12 列表 python中有没有内置的函数 Thanks UPD 我想 直接的答案是No 不管怎样 谢谢你的 片段 使用一个 建议者斯文 马尔纳克 s 2
  • Django 中使用外键的抽象基类继承

    我正在尝试在 Django 支持的网站上进行模型继承 以遵守 DRY 我的目标是使用一个名为 BasicCompany 的抽象基类来为三个子类提供通用信息 Butcher Baker CandlestickMaker 它们位于各自的应用程序
  • 为数据集生成随机 JSON 结构排列

    我想生成 JSON 结构的许多不同排列作为同一数据集的表示 最好不需要对实现进行硬编码 例如 给定以下 JSON name smith occupation agent enemy humanity nemesis neo 应该产生许多不同
  • 关闭正在运行代码的 IPython Notebook

    怎么运行的 我在 IPython Notebook 中运行了一些代码 一些迭代工作 我不小心关闭了正在运行的笔记本的浏览器 但回到 IPython 仪表板 我发现这个特定的笔记本尚未关闭 所以如果我再次打开笔记本 我会在它正在执行的代码前面
  • 如何创建简单的梯度下降算法

    我正在研究简单的机器学习算法 从简单的梯度下降开始 但在尝试用 python 实现它时遇到了一些麻烦 这是我试图重现的示例 我获得了有关房屋的数据 居住面积 以英尺为单位 和卧室数量 以及最终的价格 居住面积 英尺2 2104 卧室 3 价
  • 将函数按元素应用于两个 DataFrame

    如何应用函数z ij f x ij y ij 来自数据框X and Y相同大小并将结果保存到 DataFrameZ 这取决于你有什么样的功能 很多功能已经被矢量化为数据框 例如 等等 所以对于这些功能 你可以简单地做Z X Y or Z X
  • 美丽的汤刮 - 登录凭据不起作用

    尝试使用登录凭据抓取页面 payload email gmail com password urls login url https www spotrac com signin url https www spotrac com nba

随机推荐

  • PHP 7.2 中未定义的函数 odbc_connect()

    我收到错误 致命错误 未捕获错误 调用未定义的函数 odbc connect Ive added the extension in php ini and phpinfo is confirming that the odbc driver
  • 取消排序:记住排列并撤消它

    假设我有一个函数 f 它接受向量 v 并返回一个新向量 其中元素以某种方式转换 它通过调用假设向量已排序的函数 g 来实现这一点 所以我希望 f 的定义如下 f v Module s r s Sort v remember the perm
  • 覆盖主页中最近添加的列表

    我想知道是否可以覆盖最近添加的列表在主页中 默认行为是任何新提交的项目都会显示在列表中 无论其发布日期如何 有没有办法覆盖它 以便仅发布最新提交的出版物 例如两年内 或有条件的出版物 if dc date issued gt 2014 显示
  • 计算 PySpark 中列的中位数

    我有一个数据框 如下所示 parsed date count 2017 12 16 2 2017 12 16 2 2017 12 17 2 2017 12 17 2 2017 12 18 1 2017 12 19 4 2017 12 19
  • 如何在 Android 中录音电话

    我需要在我的 Android 应用程序中录制电话 我尝试过使用 MediaRecorder 将 AudioSource 设置为 MIC VOICE COMMUNICATION VOICE CALL 和其他选项 但他们都没有记录通话 任何人都
  • Python - 使用正则表达式查找多个匹配项并将其打印出来[重复]

    这个问题在这里已经有答案了 我需要从 HTML 源文件中查找表单内容 我做了一些搜索并找到了很好的方法来做到这一点 但问题是它只打印第一个找到的内容 我如何循环遍历它并输出所有表单内容 而不是只是第一个 line bla bla bla
  • Firestore - 监听特定字段的变化?

    如何使用 firestore js sdk 监听特定字段的变化 在文档中 他们似乎只展示了如何监听整个文档 如果任何 SF 字段发生变化 就会触发回调 db collection cities doc SF onSnapshot funct
  • 使用反向引用和哈希时的 Ruby gsub 问题

    以下代码定义带有正则表达式 键 和替换 值 的哈希 然后它迭代哈希并相应地替换字符串 简单的字符串替换效果很好 但是当我需要在替换之前计算结果时 几年到几天的情况发生变化 它就不行了 预先定义哈希值是关键 我缺少什么 任何帮助将不胜感激 a
  • 通过 OLE 从 Ruby 或 VBS 调用时,Word Document.SaveAs 会忽略编码

    我有一个脚本 VBS 或 Ruby 可以将 Word 文档保存为 过滤后的 HTML 但编码参数被忽略 HTML 文件始终以 Windows 1252 进行编码 我在 Windows 7 SP1 上使用 Word 2007 SP3 红宝石示
  • 如何使用 jQuery 悬停、更改、切换图片

    我正在做我的项目 我正在努力做到这一点 我想让每个图像的点击都能正常工作 这样每个图像都有自己的纸张 需要它悬停 我想使用切换百叶窗效果 我读到 在这方面使用 CSS 背景是明智的 这样我可以交换图片 但我无法理解它 我已经采取了一些代码来
  • Java 8 Firebase Tasks.await()

    我在 Spring Boot 应用程序中使用 Firebase JAVA sdk 尝试验证 firebase 令牌 映射 resp new HashMap Task
  • 使用 dplyr 计算组平均值,同时排除当前观察值

    Using dplyr 最好 我试图计算每个观察值的组平均值 同时从组中排除该观察值 看来这应该可以通过组合来实现rowwise and group by 但这两个功能不能同时使用 给定这个数据框 df lt data frame grou
  • Rust 正则表达式模式 - 无法识别的转义模式

    我确实有以下字符串 lengthSeconds 2664 我想与这个正则表达式匹配 Regex new lengthSeconds d 我什至尝试过这个 Regex new r lengthSeconds d 但我得到这个 regex pa
  • SWT 全局 KeyListener 按钮焦点问题

    对于我的应用程序 我需要空格键来调用独立于焦点小部件的函数 在应用程序中的任何位置 但前提是打开相应的选项卡 我发现可以在显示中添加一个过滤器 如下所示 getShell getDisplay addFilter SWT KeyDown n
  • 如何将带有空格的路径存储到bash中的变量中

    我想存储 c users me dir name到一个变量中将其传递给cd系统调用 键入时有效 cd c users me dir name or cd c users me dir name 但如果我存储它则不起作用 dirname c
  • 延迟加载 FXProperties

    这是来自的后续here 我正在实现一个表 它将数据异步加载到表单元格中 问题是 表格单元格有时无法正确更新 有时它会以某种方式 挂起 并且永远显示 正在加载 仅当我在表格中滚动一点时 实际值才会更新 重现 运行应用程序并在表中快速向下滚动
  • Javascript:显示大数字时如何避免科学记数法

    基于 为了可读性 JavaScript使用科学记数法来显示非常大的数字 大于或等于1021的绝对值 例如 写入语句 document write 1000000000000000000000000 会产生输出 1e24 我可以避免显示科学记
  • 如何使用text strip()函数?

    我可以删除数字 但不能删除字母字符 gt gt gt text 132abcd13232111 gt gt gt text strip 123 abcd 为什么以下不起作用 gt gt gt text strip abcd 132abcd1
  • PDFBox - 直线/矩形提取

    我正在尝试从 PDF 中提取文本坐标和行 或矩形 坐标 The TextPosition班级有getXDirAdj and getYDirAdj 根据相应 TextPosition 对象表示的文本片段的方向转换坐标的方法 根据 mkl 的评
  • 使用和不使用 pytest-mock 来模拟标准库函数

    出于测试目的 我想模拟 Shutil which Python 3 5 1 它在简化方法 find foo 中调用 def find foo self gt Path foo exe which foo path None if foo e