Не могу точно издеваться над вызовами MongoDB, такими как self.db ["my_collection"]. Insert_one ({"test": 1}) с pytest иPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Не могу точно издеваться над вызовами MongoDB, такими как self.db ["my_collection"]. Insert_one ({"test": 1}) с pytest и

Сообщение Anonymous »

Я использую pytest и unittest.mock для модульного тестирования класса Pymongo , который я создавал.
Вот пример кода:

Код: Выделить всё

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")
Для второй функции тестирования, test_log_network_down_failure имеет следующую ошибку.

Код: Выделить всё

assert True is False
Это указывает на то, что исключение , которое я назначил в качестве side_effect , не бросается в мой вызов в log_network_down . Если исключение будет выброшено, функция log_network_down будет возвращать false .
Как я могу правильно издеваться над моими вызовами pymongo в моих модульных тестах?

Подробнее здесь: https://stackoverflow.com/questions/796 ... insert-one
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Не могу точно издеваться над вызовами MongoDB, такими как self.db ["my_collection"]. Insert_one ({"test": 1}) с pytest и
    Anonymous » » в форуме Python
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Есть ли способ использовать Jackson ObjectMapper, чтобы прочитать объект из JSON One One One
    Anonymous » » в форуме JAVA
    0 Ответы
    33 Просмотры
    Последнее сообщение Anonymous
  • Chromadb: Почему результаты Collection.query() и Collection.get() различаются?
    Anonymous » » в форуме Python
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • Chromadb: Почему результаты Collection.query() и Collection.get() различаются?
    Anonymous » » в форуме Python
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Symfony3 Pass Form Data to Collection Inside Collection
    Anonymous » » в форуме Php
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»