Простой пример колбы с pytest и фабрикой приложений не работает

#flask #pytest

#flask #pytest

Вопрос:

Я новичок в flask, и я настроил простой пример flask и два теста с использованием pytest (см. Здесь ). Когда я запускаю только один тест, он работает, но если я запускаю оба теста, он не работает.
Кто-нибудь знает почему? Я думаю, что мне не хватает здесь некоторых основ работы flask.

структура кода:

  • app/__init__.py
 from flask import Flask

def create_app():
    app = Flask(__name__)

    with app.app_context():
        from app import views

    return app
  
  • app/views.py
 from flask import current_app as app

@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello World!'
  
  • tests/conftest.py
 import pytest
from app import create_app

@pytest.fixture
def client():
    app = create_app()

    yield app.test_client()
  
  • tests/test_app.py
 from app import create_app

def test_index(client):
    response = client.get("/")
    assert response.data == b"Index Page"

def test_hello(client):
    response = client.get("/hello")
    assert response.data == b"Hello World!"
  

Ответ №1:

Проблема заключается в вашей регистрации маршрутов app/views.py при их current_app as app регистрации. Я не уверен, как вы могли бы применить шаблон application factory без использования чертежей, поскольку описание шаблона в документации подразумевает, что они обязательны для шаблона:

Если вы уже используете пакеты и схемы элементов для своего приложения […]

Поэтому я скорректировал ваш код, чтобы вместо него использовать схему элементов:

app/main/__init__.py :

 from flask import Blueprint

bp = Blueprint('main', __name__)

from app.main import views
  

app/views.py -> app/main/views.py :

 from app.main import bp


@bp.route('/')
def index():
    return 'Index Page'


@bp.route('/hello')
def hello():
    return 'Hello World!'
  

app/__init__.py :

 from flask import Flask


def create_app():
    app = Flask(__name__)

    # register routes with app instead of current_app:
    from app.main import bp as main_bp
    app.register_blueprint(main_bp)

    return app
  

Тогда ваши тесты работают так, как задумано:

 $ python -m pytest tests
============================== test session starts ==============================
platform darwin -- Python 3.6.5, pytest-6.1.0, py-1.9.0, pluggy-0.13.1
rootdir: /Users/oschlueter/github/simple-flask-example-with-pytest
collected 2 items                                                               

tests/test_app.py ..                                                      [100%]

=============================== 2 passed in 0.02s ===============================
  

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

1. Для меня мне не нужно было перемещать папки или изменять свой код, но я просто использовал ваше предложение python -m pytest tests вместо pytest , и оно проходит тесты.