Я думаю, это поможет увидеть ваш текущий макет для редактирования.В общем, вот как я бы смоделировал pymongo collection.find()
как отдельную функцию.
test_dao.py
import unittest
import mock
from mock import Mock
import pymongo
class Test_Dao(unittest.TestCase):
"""
Set up the mock
"""
@classmethod
@mock.patch('pymongo.collection')
def setUpClass(self, mock_mongo):
a = Mock()
a.find.side_effect = self.findResponse # Assign side effect for mocked method
mock_mongo.return_value = a # Importing pymongo.collection returns the mock
"""
Response Data
"""
findResponse = 'some data'
def test_my_call():
result = dao.my_call()
assert result == list()
...
В вашем случае это стоит попробовать, но может не сработать, потому чтоВы вызываете collection.find () из переменной.
Вам может потребоваться смоделировать MongoClient () так, чтобы db_name
имел side_effect
, чтобы вернуть поддельный класс.Тогда фальшивому классу потребуется определенный вами метод collection.find ().Это было бы немного дольше и выглядело бы примерно так:
class FakeCollection:
def find:
return 'data'
class FakeDatabase:
def collection:
return FakeCollection()
...
@classmethod
@mock.patch('pymongo.MongoClient')
def setUpClass(self, mock_mongo):
a = Mock()
a.db_name.side_effect = self.dbResponse
mock_mongo.return_value = a
dbResponse = FakeDatabase()