gpt4 book ai didi

python - pytest 模拟 MongoReplicaSetClient 对象的 .count() 和 .find() 函数

转载 作者:行者123 更新时间:2023-11-28 21:21:40 24 4
gpt4 key购买 nike

我有一个名为 commons.py 的脚本,其中包含一些最常用的函数。

在我的主脚本中,我正在创建一个 mongo 连接对象:

db_ob = commons.db_connection()

db_connection 返回一个 MongoReplicaSetClient 连接对象。

如何为我的以下功能编写测试用例??

def check_entries():
try:
db_ob = commons.db_connection()
except:
print('Unable to connect to db!!')
return False
db_name = 'my_db_name'
collection_name = 'my_collection_name'
db_data = db_ob[db_name][collection_name].find()
if db_data.count() == 0:
print('No entries found in the collection!')
return False
return True

我可以模拟我的 db_connection 函数,但我在模拟 .count() 和 .find() 函数时遇到问题。

最佳答案

模拟游标以测试结果集为空时的情况的示例:

from unittest.mock import patch, MagicMock
from pymongo.mongo_replica_set_client import MongoReplicaSetClient
from pymongo.cursor import Cursor
import testee


def test_empty_result_set():
db_data_mock = MagicMock(spec=Cursor)() # 1
db_data_mock.count.return_value = 0 # 2
db_conn_mock = MagicMock(spec=MongoReplicaSetClient)() # 3
db_conn_mock.__getitem__().__getitem__().find.return_value = db_data_mock
with patch('commons.db_connection', return_value=db_conn_mock): # 4
assert not testee.check_entries() # 5

详细信息:

  1. MagicMock(spec=Cursor)返回一个模仿 pymongo.cursor.Cursor 的类类(class)。 db_data_mock是这个模拟类的一个实例。
  2. db_data_mock.count.return_value = 0 mock count方法,因此它始终返回零。

  3. 接下来两行:为 pymongo.mongo_replica_set_client.MongoReplicaSetClient 创建一个模拟实例(与 1. 中的方式相同)并将游标模拟实例连接到它,以便 find()方法总是返回 db_data_mock我们之前创建的实例。

  4. 最后,替换 commons.db_connection与返回我们的模拟函数的函数 MongoReplicaSetClient模拟对象。
  5. 所有准备工作已完成;进行实际测试。

更新:一个不使用unittest的测试在评论中被要求

如果出于某种奇怪的“纯度”原因,您不想触摸 unittest代码,您必须为此找到一个替代库,或者自己编写模拟。 pytest不提供开箱即用的模拟功能。上面的例子没有 unittest可能看起来像这样:

from collections import defaultdict
import testee


class CursorMock:

def count(self):
return 0


class ConnectionMock:

def find(self):
return CursorMock()


class MongoReplicaSetClientMock:

def __getitem__(self, name):
return defaultdict(ConnectionMock)


def db_connection_mock(*args, **kwargs):
return MongoReplicaSetClientMock()


def test_empty_result_set(monkeypatch):
monkeypatch.setattr(commons, 'db_connection', db_connection_mock)
assert not testee.check_entries()

而不是 unittest.mock.patch monkeypatch fixture被使用了。

请注意,尽管 pytest 有一些插件提供模拟功能(例如 pytest-mock ),我所知道的大多数只是 unittest.mock 的便捷包装器并且仍然在引擎盖下使用它。

关于python - pytest 模拟 MongoReplicaSetClient 对象的 .count() 和 .find() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50100752/

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