Как всегда предоставлять контекст для приложения Flask, протестированного с помощью PyTest?

# #python #unit-testing #flask #google-cloud-functions #pytest

Вопрос:

Я пытаюсь реализовать модульные тесты с помощью Pytest в приложении Flask, и мне трудно это сделать.

Мое приложение Flask использует файлы конфигурации для большинства функций (здесь some_method) для иллюстрации. Таким образом, кажется, что я должен предоставлять контекст для каждого вызова любого метода, который я хотел бы протестировать. Кажется, что я могу достичь этого с помощью «с помощью app.app_context():» при каждом вызове.

Я читал официальную документацию по тестированию, но там говорится о создании клиента. Поскольку я хотел бы выполнять модульные тесты, мне нужно вызывать вспомогательные функции, которые не являются функциями верхнего уровня.

Есть ли способ всегда предоставлять контекст, не нажимая контекст вручную при каждом вызове?

Пожалуйста, найдите ниже мою текущую реализацию:

main.py

 from flask import current_app


def main(request):
    current_app.config.from_envvar('APPLICATION_SETTINGS')
    print(some_method())
    return 'OK'


def some_method():
    # doing some stuff using the context
    world = current_app.config['SECRET_KEY']
    return world
 

test_main.py

 import pytest
from flask import current_app, Flask

from main import main, some_method

@pytest.fixture
def app():
    app = Flask(__name__)
    # load here any potential configuration configuration
    return app


def test_some_method(app):
    with app.app_context():
        # calling and doing some assertion
        some_method()
 

PS: У меня нет app = Flask(имя) в моем основном файле, потому что я работаю на платформе функций

Ответ №1:

pytest-колба, похоже, настраивает контекст при любом вызове.

conftest.py

 import pytest
from flask import Flask


@pytest.fixture
def app():
    app = Flask(__name__)
    return app
 

test_main.py

 import pytest
from flask import current_app, Flask

from main import main, some_method

def test_some_method(app):
    #with app.app_context():
        # calling and doing some assertion
    some_method()
 

работает.

Комментарии:

1. Поскольку это, по-видимому, является решением вашей первоначальной проблемы, не могли бы вы, пожалуйста, отметить ее как принятую, чтобы сообщить об этом сообществу? Спасибо.