Сбой pytest: не удается найти запрошенный URL

1

У меня есть приложение Flask:

myapp.py:

def create_app():
    app = Flask(__name__)
    return app

app = create_app()
session = session_factory()


def connect_db():
    engine = get_engine()
    return engine.connect()

@app.route("/")
def hello():
    return "Hello everyone"

Я хочу написать несколько тестов pytest, поэтому я создал два файла:

conftest.py:

import pytest
from app.myapp import create_app

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

@pytest.fixture
def client(app):
    return app.test_client()

@pytest.fixture
def runner(app):
    return app.test_cli_runner()

test_endpoints.py

import pytest
from flask import *

def test_hello(client):
    response = client.get("/")
    assert response.data == b'Hello everyone'

Когда я запускаю pytest, я получаю эту ошибку:

>       assert response.data == b'Hello everyone'
E       assert '<!DOCTYPE HT... again.</p>\n' == 'Hello everyone'
E         + Hello everyone
E         - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
E         - <title>404 Not Found</title>
E         - <h1>Not Found</h1>
E         - <p>The requested URL was not found on the server.  If you entered the URL manually please check your spelling and try again.</p>

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

Теги:
flask
pytest

1 ответ

2
Лучший ответ

Вы не добавляете какие-либо маршруты в app вы получаете от create_app() в вашем устройстве.

Если вы считаете свой код

def create_app():
    app = Flask(__name__)
    return app

app = create_app()

# ...

@app.route("/")
def hello():
    return "Hello everyone"

что hello маршрут добавляется только в этот экземпляр глобального app, а не тот, который вы приобрели из прибора.

Учебник Flask, который охватывает тестирование, использует чертежи для монтирования путей в функции create_app. Возможно, вы тоже захотите сделать это; что-то вроде этого.

bp = Blueprint('greetings', __name__)

@bp.route("/")
def hello():
    return "Hello everyone"

def create_app():
    app = Flask(__name__)
    app.register_blueprint(bp)
    return app
  • 0
    Итак, на самом деле я не собираюсь вызывать конечные точки приложения напрямую, но мне нужно будет создавать «поддельные» и проверять их?
  • 1
    Нет нет. Вам просто нужно будет использовать чертежи для сопоставления маршрутов, чтобы вы могли повторно использовать их между рабочим приложением и экземплярами тестирования.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню