Как использовать mongomock с unittest python
Я пытаюсь издеваться над своей базой данных Mongo на тестах. Я нахожу статью, за которой следую, но, к сожалению, мои тесты пишут в настоящую базу данных mongo, а не на насмешки. я имею
database.py
файл с
PyMongo
создание:
from flask_pymongo import PyMongo
mongo = PyMongo()
Я импортирую
mongo
переменная в
__init__.py
файл для инициализации с помощью приложения:
import app.database as mongo_database
def create_app(env=None):
app = Flask(__name__)
...
app.config.from_object(config())
mongo_database.mongo.init_app(app)
Я использую собственный класс Mongo для поиска данных и вставки в mongo, это пример моего контроллера:
@bp.route('/some-route', methods=['get'])
@jwt_required
def fetch_data():
...
cached_data = MongoCache.getInstance().get_data(lender_id, "lenders")
if cached_data:
return cached_data
...
MongoCache.getInstance().insert_data(lender_id, data, 'lenders')
return data
А это мой
MongoCache
класс:
import app.database
@Singleton
class MongoCache:
def __init__(self):
self.db = app.database.mongo.db
...
def get_data(self, params, collection):
...
result = self.db[collection].find_one(params)
...
return result
def insert_data(self, params, response, collection):
...
try:
self.db[collection].insert_one(data)
except Exception as e:
logger.exception(str(e))
raise Exception(e)
Но когда я добавляю исправленный клиент PyMongo, у меня это не работает:tests.py
from mongomock import MongoClient
class PyMongoMock(MongoClient):
def init_app(self, app):
return super().__init__()
class MyTest(unittest.TestCase):
def setUp(self):
if os.environ.get('FLASK_ENV') != 'testing':
raise Exception('Cannot run tests in non-test environment (FLASK_ENV must be set to "testing")')
app = create_app()
self.test_client = app.test_client()
self._ctx = app.app_context()
self._ctx.push()
database_uri = self.test_client.application.config['SQLALCHEMY_DATABASE_URI']
...
def test_actovia_lender_lookup(self):
with patch('third_party_api', return_value={}) as patched_api:
with patch("app.database", "mongo", PyMongoMock()):
resp = self.test_client.get('/my-custom-url', headers={
'Authorization': 'Bearer %s' % jwt['access_token']
})
self.assertEqual(resp.status_code, 200)
patched_api.assert_called_with('1')
Есть ли у кого-нибудь предложения, что я делаю не так, и как это исправить?