# #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. Поскольку это, по-видимому, является решением вашей первоначальной проблемы, не могли бы вы, пожалуйста, отметить ее как принятую, чтобы сообщить об этом сообществу? Спасибо.