Я не совсем уверен, для чего нужен mongomock
, но похоже, что он предназначен для имитации всей базы данных mongo, а не для фактического использования python mocking.Я собираюсь ответить, не включая mongomock
, так как я не думаю, что вам это действительно нужно, поэтому вы можете принять это за то, что оно того стоит.
Было несколько проблем:
Вызов patch.object
исправит данный метод на любом объекте, который вы ему дадите.Если вы вызываете get_db
в тесте, то code.action
вызывает get_db
, это 2 разных объекта.Может это работает?Но я настроен скептически, поэтому я просто изменил его.
Не используйте code
в качестве имени вашего модуля.Это уже модуль, включенный в Python.
code.action
отсутствовали аргументы и оператор возврата.
Вы также заметите, что яизменил, как и что насмехались, чтобы проиллюстрировать различные способы выполнения насмешек.Тест 1 проверяет вызов insert
с помощью декоратора функции.Тест 2 высмеивает вызов get_db
с contextmanager
.Либо правильно, просто показывая, что у вас есть варианты.
Вот готовый продукт:
my_mongo.py:
from pymongo import MongoClient
def get_db():
client = MongoClient(os.environ['MONGODB_URI'])
db = client['my_db']
return db
def insert(id, data):
return get_db().results.insert_one({"id": id, "data":data.to_json()}).id # df was undefined, updated to data
my_code.py:
import my_mongo
# I added id and data args. They were undefined
def action(id, data):
return my_mongo.insert(id, data) # I added a return here
my_test.py
from unittest import mock
import my_code
# I removed the contextmanager import. Nothing is being evaluated here that would
# need to be patched, so I'm pretty certain it has no effect
@mock.patch('my_mongo.insert')
def test_action_1(mock_insert):
expected_id = 1
mock_insert.return_value = expected_id
ret = my_code.action(expected_id, mock.Mock())
assert ret == expected_id
def test_action_2():
with mock.patch('my_mongo.get_db') as mock_get_db:
expected_id = 'some id'
mock_db = mock.Mock()
mock_db.results.insert_one.return_value.id = expected_id
mock_get_db.return_value = mock_db
ret = my_code.action(expected_id, mock.Mock())
assert ret == expected_id