Как издеваться над PyMongo для тестирования с приложением Flask? - PullRequest
1 голос
/ 07 мая 2019

Я нашел похожие вопросы, но они, кажется, охватывают только насмешливый MongoDB и не упоминают Flask.

У меня есть приложение Flask, и я пытаюсь протестировать его с помощью PyTest (включая PyTest)-Монго и PyTest-Flask).Однако, прежде чем я смогу приступить к написанию каких-либо тестов, мой тестовый скрипт вылетает.Сбой происходит при импорте сценария с моим приложением Flash: он пытается создать объект PyMongo без URL-адреса.

Мой вопрос таков: как я могу убедиться, что PyMongo корректно проверяется на этом этапе?Согласно документации PyTest-Mongo тестовое устройство MongoDB должно быть передано каждой из функций теста, но это не помогает мне, если он падает при импорте.

test_app.py:

import pytest
import pytest_mongodb

from app import app


@pytest.fixture
def client():
    app.config['TESTING'] = True
    return client

app.py:

import ...

app = Flask(__name__)
app.config["MONGO_DBNAME"] = os.environ.get('DB_NAME')
app.config["MONGO_URI"] = os.environ.get('MONGO_URI')
app.secret_key = os.environ.get('SECRET')

mongo = PyMongo(app)

...

if __name__ == '__main__':
app.run(host=os.environ.get('IP'),
        port=int(os.environ.get('PORT')),
        debug=False)

1 Ответ

0 голосов
/ 04 июля 2019

Требовалось быстрое исправление, поэтому я отредактировал app.py так, чтобы он мог работать только после сбоя, если PyMongo не инициализируется при выполнении файла (т. Е. Игнорирует неудачную инициализацию PyMongo при выполнении юнит-тестов.)

app = Flask(__name__)
app.config["MONGO_DBNAME"] = os.environ.get('DB_NAME')
app.config["MONGO_URI"] = os.environ.get('MONGO_URI')
app.secret_key = os.environ.get('SECRET')

try:
    mongodb = PyMongo(app).db
except ValueError:
    """We don't provide a URI when running unit tests, so PyMongo will fail to initialize.
    This is okay because we replace it with a version for testing anyway. """
    print('PyMongo not initialized!')
    mongodb = None
.
.
.

if __name__ == '__main__':
    if not mongodb:
        print('Cannot run. PyMongo failed to initialize. Double check environment variables.')
        exit(1)

    app.run(host=os.environ.get('IP'),
            port=int(os.environ.get('PORT')),
            debug=False)

В моем файле тестов я просто назначаю фиктивный клиент mongoDB приложению в тестах, которые в нем нуждаются.Определенно не идеальное решение.

def test_redacted(client, mongodb):
    app.mongodb = mongodb
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...