pytest с Flask: простой способ перенести настройку нашего приложения без create_app ()? - PullRequest
0 голосов
/ 06 мая 2019

У нас есть приложение Flask, в котором основная часть кода установки Flask находится в файле run.py в корне нашего приложения. Так что в основном этого много:

app = Flask(__name__)
app.debug = True
app.config(...)
app.config(...)

api = Api(app)
api.add_resource(resources.Registration, '/registration')
api.add_resource(...)
api.add_resource(...)

Я пытаюсь добавить к нему юнит-тестирование, которого у нас сейчас нет. Я примерно следую учебному проекту Flask (https://github.com/pallets/flask/tree/1.0.2/examples/tutorial) в качестве примера.

Таким образом, в основном вы создаете все приложение как модуль, который можно импортировать, и этот модуль является заводским. Так что __init__.py имеет функцию create_app, которая создает ваше приложение (https://github.com/pallets/flask/blob/1.0.2/examples/tutorial/flaskr/init.py). Я думаю, это вызывается автоматически, когда модуль импортируется основным приложением во время нормальной работы, но также может быть явно вызвано в conftest. py (https://github.com/pallets/flask/blob/1.0.2/examples/tutorial/tests/conftest.py), который, я думаю, (?) автоматически вызывается как часть запуска pytest.

Так что мой вопрос на самом деле довольно прост: есть ли приличный способ запустить несколько pytest тестов без рефакторинга кода нашего основного приложения в заводской модуль? Я не хочу слишком сильно трогать основное приложение ... Я бы хотел оставить его как очень простую настройку, как мой код, в верхней части этого вопроса.

Другими словами, это базовая настройка приложения в conftest.py руководства после удаления содержимого БД:

@pytest.fixture
def app():

    app = create_app({
        'TESTING': True,
        'DATABASE': db_path,
    })

    yield app

И я хочу app без create_app. Но так как весь наш код приложения находится только в нашем базовом run.py, я не могу придумать хорошего способа сделать это, кроме копирования всего и поддержания его в синхронизации. Я не могу импортировать app из run.py, так как это не модуль, я не думаю.

Извините, что это так просто - ни тестирование, ни операторы импорта не являются моими сильными сторонами.

1 Ответ

0 голосов
/ 06 мая 2019

Я думаю, что нашел способ ... просто сделать так, чтобы вы могли включать модули из родительской папки (согласно Импорт модулей из родительской папки ), а затем импортировать run и получить переменную из этого:

import os,sys,inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0,parentdir)

import run

@pytest.fixture
def app():
    app = run.app
    yield app

... конечно, мне нужно найти способ настроить его поведение для целей тестирования (то есть эквивалент прохождения учебника 'Testing': True), так что это моя следующая задача.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...