pytest:无法模拟我的班级的 __init__

2024-03-05

我有一个习惯Db类,具有基本操作。我正在尝试围绕它编写测试 - 在__init__在我的班级中,我正在连接到我想避免的实际数据库(因为我只是编写单元测试,不需要连接到实际数据库)。

这是我的代码:

@mock.patch( 'mydb.Db' )
@pytest.mark.parametrize( "input,expected", [
    (
        {
            'key'   : "x" ,
            'value' : 5   ,
        } , 
        [  "x = 5" ]
    ) ,
    ])
def test_where_statement( mock_db, input, expected):
    mock_db.__init__.return_value = None
    assert expected == mock_db.where( input[ "key"] , input[ "value" ] )._condition_list

它在我将 return_value 设置为 None 的行上失败 - 问题是:

    def test_where_statement( mock_db, input, expected):
>       mock_db.__init__.return_value = None
E       AttributeError: 'instancemethod' object has no attribute 'return_value'

我只想模拟 init 函数,然后能够运行 where 函数(例如,它构建我的查询的 where 语句)。

我缺少什么?


AFAIK 你可以在这里有两种不同的方法。一是嘲讽__init__方法直接与您的补丁一起使用,它将按预期工作(原始__init__不会被调用)。

@mock.patch('mydb.Db.__init__', return_value=None)

其次,使用您当前的方法,而不是将 None 值分配给mock_db__init__方法(不会一路调用,因为对象已经是模拟的)将 return_value 分配给mock_db,调用该方法以获取 Db 类的实例(mock_db.return_value应该指向 Db 实例的模拟版本),或者如果您对更改默认模拟的行为不感兴趣,则将其保留为原样,因为代码将被执行(AFAIR 当调用类来创建其实例时某些模拟对象是自动创建的)。

编辑: 您需要确保在正确的位置模拟 mydb。经验法则是模拟事物的导入位置,而不是它们所在的位置。换句话说,如果您想测试放置在文件中的代码my_package.my_module具有import mydb你需要修补my_package.my_module.mydb.Db.

关于模拟的很棒的资源:ELI5 模拟解释 https://www.toptal.com/python/an-introduction-to-mocking-in-python

首先应该注意的事情之一是我们使用mock.patch方法装饰器来模拟位于mymodule.os的对象,并将该模拟注入到我们的测试用例方法中。仅仅模拟 os 本身,而不是在 mymodule.os 中引用它,不是更有意义吗?

嗯,在导入和管理模块方面,Python 有点像一条狡猾的蛇。在运行时, mymodule 模块有自己的操作系统,该操作系统被导入到模块中自己的本地范围中。因此,如果我们模拟 os,我们将不会在 mymodule 模块中看到模拟的效果。 不断重复的口头禅是:

模拟一个物品的使用地,而不是它的来源地。

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

pytest:无法模拟我的班级的 __init__ 的相关文章

  • 如何阻止 Django 中发生级联删除?

    我的 Django 应用程序中有三个模型类 class Folder models Model folder models ForeignKey Folder null True blank True related name folder
  • Scala 的代码覆盖率工具 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 有没有办法清理 jinja2 生成的 html?

    我们使用 jinja2 来创建 html 但是 由于我们在 jinja 中执行许多循环和其他操作来生成 html 所以 html 看起来 很丑 注意 这只是为了美观 我们可以做些什么来清理 html 吗 除了清理我们的 jinja2 代码之
  • 动态添加jinja模板

    我有一个 jinja 模板 它是一组 div 标签内的唯一内容 div include temppage html div 当我按下按钮时 我想用其他内容替换标签之间的所有内容 我希望用另一个 jinja 模板 include realpa
  • 如何使用scrapy抓取xml url

    你好 我正在使用 scrapy 来抓取 xml url 假设下面是我的 Spider py 代码 class TestSpider BaseSpider name test allowed domains www example com s
  • 根据两个预先计算的直方图报告两个样本的 K-S 统计量

    Problem 在这里 我绘制了存储在文本文件中的 2 个数据集 在列表中 dataset 每个包含 218 亿个数据点 这使得数据太大而无法作为数组保存在内存中 我仍然能够将它们绘制为直方图 但我不确定如何通过2 样本KS测试 http
  • Scrapy 未通过请求回调从项目中的已抓取链接返回附加信息

    基本上 下面的代码会抓取表格的前 5 项 其中一个字段是另一个 href 单击该 href 会提供更多信息 我想收集这些信息并将其添加到原始项目中 所以parse应该将半填充的项目传递给parse next page然后刮掉下一位并返回完成
  • 使用 Python 读取 App Engine 上的文件?

    是否可以在 GAE 上打开文件来读取其内容并获取最后修改的标签 我收到 IOError Errno 13 文件无法访问 我知道我无法删除或更新 但我相信阅读应该是可能的 有人遇到过类似的问题吗 os stat f r st mtim 您可能
  • 带有 UnboundLocalError 的本地和全局引用

    我不太明白为什么代码 def f print s s foo f 运行得很好但是 def f print s s bar s foo f 给我 UnboundLocalError 我知道我可以通过声明来解决这个问题s作为函数内的全局变量或简
  • 如何在海龟图形中将多个按键绑定在一起?

    我正在尝试制作一个连接点的 python 游戏 我希望游戏记录 2 次按钮按下操作 示例 如果用户按向上和向右箭头键 乌龟将向东北方向移动 45 度 这是我的代码 import turtle flynn turtle Turtle win
  • 使用 RGB 数据将输入数据剪切到 imshow 的有效范围(对于浮点数为 [0..1],对于整数为 [0..255])

    我尝试将 MRI 切片转换为 PNG 格式后运行图形切割算法 我不断遇到以下问题 Clipping input data to the valid range for imshow with RGB data 0 1 for floats
  • 在 Python 中快速确定小于 10 亿的数字是否为素数

    我目前在 python 中检查数字素数的算法对于 1000 万到 10 亿之间的数字来说速度很慢 我希望它能够得到改进 因为我知道我永远不会得到超过 10 亿的数字 背景是我无法获得足够快的实现来解决项目 Euler 的问题 60 我在 7
  • 用于 OAuth 身份验证的 WSGI 中间件

    我使用构建了一个非常小的网络应用程序Flask http flask pocoo org 现在我想向网站添加非常基本的身份验证 我不需要授权 由于 Flask 不支持开箱即用的 auth auth 我想插入 WSGI 中间件来完成这项工作
  • django REST框架多源领域

    假设我的 models py 中有这些 models py class Theme models Model An theme is an asset of multiple levels adventure models ForeignK
  • Tornado:DummyFuture 不支持结果阻塞

    我试图获得一个非常简单的初始服务器 它可以 异步 获取 url 来工作 但它会抛出 Exception DummyFuture does not support blocking for results 有这个SO https stacko
  • 为什么类型提示“float”接受“int”,而它甚至不是子类?

    一方面 我了解到数字可以int or float应将类型注释为float 来源 PEP 484 类型提示 https www python org dev peps pep 0484 the numeric tower and 这个计算器问
  • 无法编辑,但可以在 Django 管理中添加新的内联

    这是我的模型 class Note note models TextField null False blank False editable True user models ForeignKey to User null True bl
  • 使用 MinGW 链接到 Python

    我不想创建一个嵌入Python解释器的跨平台程序 并用MinGW编译它 但是 Python 二进制发行版没有提供 MinGW 链接的库 仅python32 lib对于 Visual C 并且 Python 源包不提供使用 MinGW 编译的
  • 如何检索 SQLAlchemy 结果集的 python 列表? [复制]

    这个问题在这里已经有答案了 我有以下查询来检索单列数据 routes query select schema stop times c route number schema stop times c stop id stop id dis
  • 重定向到破折号中的 url

    我正在使用 dash 构建一个仪表板 每当单击特定数据点时 我都会创建一个唯一的 url 如何将用户重定向到此创建的 url 我正在使用下面给出的代码 每当有人单击任何数据点时 单击事件就会触发并执行回调函数 app layout html

随机推荐