Я пытался добавить модульные тесты в свое приложение 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 (). Я не знаю, как это отлаживать, поэтому буду благодарен за любые советы.