gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:53:39 25 4
gpt4 key购买 nike

我想了解 mock/monkeypatch/pytest-mock能力。

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

我的代码结构:

/
./app
../__init__.py
../some_module1
.../__init__.py
../some_module2
.../__init__.py
./tests
../test_db.py
/app/__init__.py是我的应用程序(如果有帮助的话,是 Flask 应用程序)以及将数据库连接对象初始化到 MongoDB 数据库的地方:
# ...

def create_app():
# ...
return app

db_conn = DB()
some_module1some_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-mockmagicmock但我不认为或不知道如何模拟 db_conn在我的测试中。

最佳答案

我相信您没有在真实数据库上测试案例是对的,因为如果您使用外部依赖项,它不再是单元测试。

有可能to specify return-value 并为 Mock 自定义它 ( different return values on each iteration even )或 MagicMock对象。

from unittest.mock import Mock, patch 

from app import db_conn


@patch('app.db_conn.find')
def test_some_func1(db_con_mock):
...
assert ...

请记住,在每个 patch您应该指定 db_conn 的导入路径- db_conn所在的路径** 用于 (我假设它在每个测试中都是不同的路径),而不是它被定义的地方。

关于python - 如何使用 pytest-mock 或 magicmock 模拟导入的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58377166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com