如何使用 pytest-mock 或 magicmock 模拟导入的对象

2024-03-30

我正在尝试理解mock/monkeypatch/pytest-mock能力。

让我知道这是否可能。如果没有,请建议我如何测试此代码。

我的代码结构:

/
./app
../__init__.py
../some_module1
.../__init__.py
../some_module2
.../__init__.py
./tests
../test_db.py

The /app/__init__.py是我的应用程序(Flask 应用程序,如果有帮助的话)启动的地方,同时初始化 MongoDB 数据库的数据库连接对象:

# ...

def create_app():
  # ...
  return app

db_conn = DB()

The some_module1 and some_module导入db_conn对象并将其用作其功能的一部分:

## some_module1/__init__.py
from app import db_conn

...
db = db_conn.db_name2.db_collection2

def some_func1():
    data = db.find()
    # check and do something with data
    return boolean_result

...

## some_module2/__init__.py
from app import db_conn

...
db = db_conn.db_name1.db_collection1

def some_func2():
    data = db.find()
    # check and do something with data
    return boolean_result
...

在我的测试中,我想根据从数据库接收到的数据来测试我的代码是否正常工作。 我想模拟数据库,更具体地说是db_conn对象,因为我不想使用真正的数据库(这将需要大量的工作来设置环境并维护它)。

关于如何模仿的任何建议db_conn?

我一直在探索pytest-mock and magicmock但我不认为也不知道如何嘲笑db_conn在我的测试中。


要回答最初的问题“如何使用 pytest-mock 或 magicmock 模拟导入的对象”,您可以执行以下操作:

from unittest import mock  # because unittest's mock works great with pytest

def test_some_func1():
    with mock.patch('some_module1.db', mock.MagicMock(return_value=...)) as magicmock:
        result = some_func1(...)
        assert ... e.g. different fields of magicmock
        assert expected == result

# or alternatively use annotations

@mock.patch('some_module2.db', mock.MagicMock(return_value=...))
def test_some_func2():
        result = some_func2(...)

请注意,您没有修补数据库的实际来源 http://alexmarandon.com/articles/python_mock_gotchas/

对于您的其他用例

我想模拟数据库(使用 mongo 数据库),更具体地说是“db_conn”对象

您同样按照上面链接的提示进行操作:

mock.patch('some_module1.db_conn', mock.MagicMock(return_value=...))

鉴于此,您会在测试中注意到db从 `db = db_conn.db_name2.db_collection2' 将创建另一个模拟对象。对该对象的调用也将被记录。通过这种方式,您还可以跟踪呼叫和值分配的历史记录。


此外,请参阅如何修补 mongodb 的示例。 https://stackoverflow.com/a/51994349/1256837

要测试 Flask 应用程序,请参阅烧瓶的文档 https://flask.palletsprojects.com/en/1.1.x/testing/. Also 这也是一个很好的解释,并且使用数据库连接 https://www.patricksoftwareblog.com/testing-a-flask-application-using-pytest/.

作为一般提示,就像 @MikeMajara 提到的那样 - 将代码更多地分成更小的函数,这些函数也易于测试。 TDD 的传统是:先编写测试,然后实现,然后重构(尤其是 DRY!)

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

如何使用 pytest-mock 或 magicmock 模拟导入的对象 的相关文章

随机推荐

  • 如何添加链接到 Flash 横幅

    我主要是一名开发人员 不知道如何使用 Adob e Flash CS4 有没有一种简单的方法可以将链接添加到 Flash 横幅 我有 flv 文件 其中包含库和两层中的一些项目 请给我一步一步的指示 编辑 我找到简单的解决方案 步骤如下 G
  • 放置项和对齐项有什么区别?

    想知道使用有什么区别 display flex align items center or display flex place items center 视觉上看起来是一样的 place items 有 90 的浏览器支持 align i
  • 具有 .htaccess 和 mod_rewrite 的静态 HTML 文件的语义 URL

    mod rewrite 总是让我困惑 谁能告诉我获得以下干净 URL 所需的规则 左边是所需的 URL 右边是真实的 URL our work gt our work html our work some project gt our wo
  • 使用 CORS 和 OpenShift 上的节点应用程序通过 POST 清空请求正文

    我正在 OpenShift 上使用 Express 创建一个简单的 Node 应用程序 我只是修改 OpenShift 的默认示例 Node 应用程序 我想要 CORS 支持 var cors require cors Initialize
  • 在Python中计算元音

    def main print count def countVowels string vowel aeiouAEIOU count 0 string input enter a string for i in string if i in
  • 文本区域和超链接?

    我有两个关于 Visual Studio 中的 C 的快速 简单的问题 首先 除了程序中的文本区域之外 是否有类似标签的东西 我想在我的程序中包含多行文本 但似乎只能使用打开自动换行的 DotNetBar 标签来完成它 其次 有没有办法在不
  • 是否存在任何危险,例如使用 pip 的 --ignore-installed 标志导致冲突?

    我无法找到 pip 的良好文档 ignore installed flag pip install help简单地说 忽略已安装的软件包 而是重新安装 除了系统上存在更多问题的副作用之外 因为安装的软件包在升级时不会被卸载 是否还有其他已知
  • PHP 评估 $a="$a"?

    我正在查看一些工作代码 并发现了这一行 eval element element 我真的很困惑为什么 PHP 开发人员会写这行代码 除了为自身设置一个变量之外 这还有什么目的 幸运的是 该行所在的函数从未被调用 上面的例子将输出 This
  • 在 Woocommerce 结帐页面中添加信息丰富的自定义消息

    我有一个基于 WP Woocommerce 的网站 我想告诉我的客户 每当他们在我的商店购买东西时 他们订单的 3 都会捐赠给慈善协会 我想显示根据总数计算的确切金额 例如 总计 150 欧元 5 欧元将被下放等 我该如何管理它 您可以将其
  • > 无法在 /opt/android-sdk-linux 中找到哈希字符串“android-26”的目标

    乌班图16 04 android sdk 位于 opt android sdk linux android home 配置 导出 ANDROID HOME opt android sdk linux opt android sdk linu
  • C++ 中真正的异步文件 IO

    我有一个超快的 M 2 驱动器 有多快 没关系 因为我无论如何也无法利用这个速度 这就是我问这个问题的原因 我有一个需要大量内存的应用程序 太多了 以至于内存装不下 幸运的是 并不是一下子就需要它 相反 它用于保存计算的中间结果 不幸的是
  • AdMob - Android 活动中的更好性能

    我有一个 Android 应用程序 我在其中实现了 AdMob 广告 我的布局代码非常简单 将 AdView 添加到 LinearLayout 中
  • 访问者模式对于动态类型语言有用吗?

    访问者模式允许在不扩展对象类的情况下编写对对象的操作 当然 但为什么不直接编写一个全局函数或静态类来从外部操作我的对象集合呢 基本上 在像 java 这样的语言中 accept 出于技术原因需要方法 但在一种语言中我可以实现相同的设计而无需
  • 替换字符串中最后一次出现的字符[重复]

    这个问题在这里已经有答案了 我有一个像这样的字符串 Position fix dial 我想用转义双引号 替换最后一个双引号 字符串的结果是 Position fix dial 我怎样才能做到这一点 我知道要替换字符串的第一次出现 但不知道
  • Android 阻止将照片保存在 DCIM/公共文件夹中

    我正在开发一个 Android 应用程序 用户单击按钮后可以拍照 这张照片将通过以下方法保存到内部包存储 data data package private String saveToInternalSorage Bitmap bitmap
  • 如何在 sqlalchemy 中执行返回的原始查询

    我有一张桌子Ticket具有id 自动递增 票号 读取序列的触发器 value and date在甲骨文中 我想做以下事情 INSERT INTO TICKET value date values 100 TO DATE 07 29 201
  • 在运行时创建实例变量

    我想在运行时动态创建实例变量 并且想将这些变量添加到类别中 实例变量的数量可能会根据我用于定义它们的配置 属性文件而变化 有任何想法吗 Use 关联参考 http developer apple com library ios docume
  • 从 Angular 访问 webapi 时出现 401 未经授权的错误

    当用户访问我的 webapi 应用程序时 我需要捕获用户的域 用户名 在我的开发机器上 我的 webapi 位于localhost 10570和我的 angularjs 网站 它调用网络服务localhost 34575 如果我直接调用我的
  • xUnit 和 Moq 不支持 async -await 关键字

    我正在尝试探索如何将 async 和 wait 关键字应用到我的 xUnit 测试中 我正在使用 xUnit 1 9 和 Async CTP 1 3 这是我的测试用例 我有一个接口 它指定一个异步方法调用 public interface
  • 如何使用 pytest-mock 或 magicmock 模拟导入的对象

    我正在尝试理解mock monkeypatch pytest mock能力 让我知道这是否可能 如果没有 请建议我如何测试此代码 我的代码结构 app init py some module1 init py some module2 in