- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个名为 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
详细信息:
MagicMock(spec=Cursor)
返回一个模仿 pymongo.cursor.Cursor
的类类(class)。 db_data_mock
是这个模拟类的一个实例。 db_data_mock.count.return_value = 0
mock count
方法,因此它始终返回零。
接下来两行:为 pymongo.mongo_replica_set_client.MongoReplicaSetClient
创建一个模拟实例(与 1. 中的方式相同)并将游标模拟实例连接到它,以便 find()
方法总是返回 db_data_mock
我们之前创建的实例。
commons.db_connection
与返回我们的模拟函数的函数 MongoReplicaSetClient
模拟对象。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/
看来MongoClient和 MongoReplicaSetClient可以连接到 mongo 副本集。事实上,它们的文档页面几乎相同——相同的选项、相同的方法等——除了后者的构造函数需要我指定一个副
我使用带有 MongoDB 2.4.4 副本集的 Celery 3.0.15 作为后端(pymongo 版本 2.5.1)。我还使用相同的副本集作为主应用程序数据存储: CELERY_CONFIG =
我有一个名为 commons.py 的脚本,其中包含一些最常用的函数。 在我的主脚本中,我正在创建一个 mongo 连接对象: db_ob = commons.db_connection() db_c
我是一名优秀的程序员,十分优秀!