Ошибки Pytest с flask - PullRequest
       27

Ошибки Pytest с flask

1 голос
/ 08 мая 2020

Я пытался добавить модульные тесты в свое приложение Flask. Я использую шаблон фабрики приложений. Я использовал https://github.com/cookiecutter-flask в качестве справочника, и я считаю, что реализовал тесты после их реализации. Я получаю некоторые ошибки при запуске py.test, которые я не понимаю, как исправить, и любая помощь будет принята с благодарностью.

Я включил то, что я считал релевантными частями моего кода ниже:

tests / conftest.py

import pytest
from webtest import TestApp
from urlshort import create_app
from urlshort.models import Link
from urlshort.models import db as _db

@pytest.fixture
def app():
    """Create application for the tests."""
    _app = create_app(testing=True)

    ctx = _app.test_request_context()
    ctx.push()
    yield _app
    ctx.pop()


@pytest.fixture
def testapp(app):
    """Create Webtest app."""
    return TestApp(app)


@pytest.fixture
def db(app):
    """Create database for the tests."""
    _db.app = app
    with app.app_context():
        _db.create_all()

    yield _db

    _db.session.close()
    _db.drop_all()


@pytest.fixture
def link(db):
    """Create a link for the tests."""
    link = Link(long='https://example.com/', short='3')
    db.session.add(link)
    return link

tests / test_forms.py

from urlshort.forms import URLForm, UnshortenForm
from urlshort.strings import Strings

class TestURLForm:
    """URLForm tests"""

    def test_inject_strings(self, testapp):
        """Tests if the inject_strings() context processor works as expected"""
        response = self.testapp.post('/', data=dict(
            url='notaurl'
        ), follow_redirects = True)
        assert Strings.strings['URLValidationError'].encode() in response.data

    def test_invalid_link(self):
        """Invalid link"""
        form = URLForm(url='notaurl')
        assert form.validate() is False

Вот мой create_app, если он любая помощь:

urlshort / __ init __. py

from flask import Flask

from config import Config, TestConfig
from urlshort.models import db


def create_app(testing=False):
    app = Flask(__name__)
    if testing:
        app.config.from_object(TestConfig)
    else:
        app.config.from_object(Config)

    db.init_app(app)

    from urlshort.routes import shortener

    app.register_blueprint(shortener)
    with app.app_context():
        db.create_all()

    app.shell_context_processor(shell_context)

    return app


def shell_context():
    """Shell context objects."""
    return {"db": db}

Вот соответствующий вывод для pytest:

============================================================================================ short test summary info ============================================================================================
FAILED tests/test_forms.py::TestURLForm::test_invalid_link - RuntimeError: Working outside of application context.

Тесты должны быть работает с test_request_context (). Я не знаю, как это отлаживать, поэтому буду благодарен за любые советы.

1 Ответ

0 голосов
/ 08 мая 2020

Мне удалось исправить проблему, решение заключалось в передаче app в test_invalid_link:

    def test_invalid_link(self, app):
        """Invalid link"""
        form = URLForm(url='notaurl')
        assert form.validate() is False

, чтобы оно действительно получило контекст приложения.

...