Вот пример кода:
Код: Выделить всё
from pymongo import MongoClient
import logging
import traceback
import time
class mongo_client():
def __init__(self):
self.db = MongoClient("mongodb://localhost:27017/")
self.db = self.db["TestDB"]
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
self.logger = logging.getLogger(__name__)
def log_network_down(self):
try:
status = {}
status["online"] = False
status["time"] = time.time()
self.db["NetworkMonitor.logs.networkStatus"].insert_one(status)
return True
except:
self.logger.error(f"A problem occurred in the log_network_down function")
tb = traceback.format_exc()
self.logger.exception(tb)
return False
< /code>
Вот пример тестового кода: < /p>
from mongo_client import mongo_client
import pytest
import unittest.mock as mock
@pytest.fixture
def mongo_client_instance():
return mongo_client()
class TestMongoClient():
EPOCH_TIME_TEST = 1750110615.6034029
MONGODB_OPERATION_ID = "1jhf2938yjoqyhiyuf0q"
@mock.patch('time.time')
def test_log_network_down_success(self, mock_time, mongo_client_instance):
mock_time.return_value = self.EPOCH_TIME_TEST
mock_collection = mock.MagicMock() #Mock return of self.db["NetworkMonitor.logs.networkStatus"]
mock_insert = mock.MagicMock(acknowledged=True, inserted_id=self.MONGODB_OPERATION_ID) #Mock insert_one(status)
mock_collection.insert_one.return_value = mock_insert #Mock self.db["NetworkMonitor.logs.networkStatus"].insert_one(status)
#Mock the return of self.db["NetworkMonitor.logs.networkStatus"]
with mock.patch.object(mongo_client_instance.db, '__getitem__', return_value=mock_collection) as mock_db_getitem:
result = mongo_client_instance.log_network_down()
assert result is True
expected_status = {"online" : False, "time" : self.EPOCH_TIME_TEST}
mock_db_getitem.assert_called_once_with("NetworkMonitor.info.currentNetworkStatus")
mock_collection.assert_called_once_with(expected_status)
mongo_client_instance.logger.error.assert_not_called()
mongo_client_instance.logger.exception.assert_not_called()
mock_time.assert_called_once()
@mock.patch('time.time')
@mock.patch('traceback.format_exc', return_value="Simulated Traceback Error")
def test_log_network_down_failure(self, mock_format_exc, mock_time, mongo_client_instance):
mock_time.return_value = self.EPOCH_TIME_TEST
mock_collection = mock.MagicMock() #Mock return of self.db["NetworkMonitor.logs.networkStatus"]
mock_insert = mock.MagicMock(acknowledged=True, inserted_id=self.MONGODB_OPERATION_ID) #Mock insert_one(status)
mock_insert.side_effect = Exception("Simulated Error") #Add exception
mock_collection.insert_one.return_value = mock_insert #Mock self.db["NetworkMonitor.logs.networkStatus"].insert_one(status)
mock_collection.insert_one.side_effect = Exception("Simulated Error") #Add exception here as well just for testing. The previous exception should be enough
#Mock the return of self.db["NetworkMonitor.logs.networkStatus"]
#Mock exception error and exception messages
with mock.patch.object(mongo_client_instance.db, '__getitem__', return_value=mock_collection) as mock_db_getitem, \
mock.patch.object(mongo_client_instance.logger, 'error') as mock_log_error, \
mock.patch.object(mongo_client_instance.logger, 'exception') as mock_log_exception:
result = mongo_client_instance.log_network_down()
assert result is False
expected_status = {"online" : False, "time" : self.EPOCH_TIME_TEST}
mock_db_getitem.assert_called_once_with("NetworkMonitor.info.currentNetworkStatus")
mock_collection.assert_called_once_with(expected_status)
mock_log_error.assert_called_once_with(f"A problem occurred in the log_network_down function")
mock_log_exception.assert_called_once_with("Simulated Traceback Error")
mock_time.assert_called_once()
Код: Выделить всё
AssertionError: Expected '__getitem__' to be called once. Called 0 times.
< /code>
для теста < /p>
mock_db_getitem.assert_called_once_with("NetworkMonitor.info.currentNetworkStatus")
Код: Выделить всё
assert True is False
Как я могу правильно издеваться над моими вызовами pymongo в моих модульных тестах?
Подробнее здесь: https://stackoverflow.com/questions/796 ... insert-one