Moin,
ich sitze vor einem Fehler beim Unittesting meiner Flask Application. Die Anwendung selber läuft problemlos aber beim Unittesting bekomme ich einen Fehler, den ich nicht nachvollziehen und auch nicht auflösen kann.
Ich folge dabei dem Tutorial flask.palletsprojects.com/en/3.0.x/tutorial/
Folgende Datenstruktur ist vorhanden:
\inotodo
\templates
__init__.py
db.py
auth.py
....
\tests
_init__.py
conftest.py
test_auth.py
...
conftest.py
test_auth.py
Bei jedem Test ist der Inhalt von rsponse data nach dem aufruf von client.post
Und bei test_login diesen Fehler, der vielleicht auch Auskunft geben kann.
Diese Pytheon Pakete sind installiert:
Hat jemand eine Idee, was falsch läuft und wie man es beheben kann?
Danke im Vorraus
ich sitze vor einem Fehler beim Unittesting meiner Flask Application. Die Anwendung selber läuft problemlos aber beim Unittesting bekomme ich einen Fehler, den ich nicht nachvollziehen und auch nicht auflösen kann.
Ich folge dabei dem Tutorial flask.palletsprojects.com/en/3.0.x/tutorial/
Folgende Datenstruktur ist vorhanden:
\inotodo
\templates
__init__.py
db.py
auth.py
....
\tests
_init__.py
conftest.py
test_auth.py
...
conftest.py
Python-Quellcode
- import os
- import tempfile
- import pytest
- from inotodo import create_app
- from inotodo.db import get_db, init_db
- with open(os.path.join(os.path.dirname(__file__), 'sql/sqldata.sql'), 'rb') as f:
- _data_sql = f.read().decode('utf8')
- @pytest.fixture
- def app():
- db_fd, db_path = tempfile.mkstemp()
- app = create_app({
- 'TESTING': True,
- 'DATABASE': db_path,
- })
- with app.app_context():
- init_db()
- get_db().executescript(_data_sql)
- yield app
- os.close(db_fd)
- os.unlink(db_path)
- @pytest.fixture
- def client(app):
- return app.test_client()
- @pytest.fixture
- def runner(app):
- return app.test_cli_runner()
- class AuthActions(object):
- def __init__(self, client):
- self._client = client
- def login(self, username='test', password='test'):
- return self._client.post(
- '/auth/login',
- data={'username': username, 'password': password}
- )
- def logout(self):
- return self._client.get('/auth/logout')
- @pytest.fixture
- def auth(client):
- return AuthActions(client)
test_auth.py
Quellcode
- import pytest
- from flask import g, session
- from inotodo.db import get_db
- def test_register(client, app):
- assert client.get('/auth/register').status_code == 200
- response = client.post(
- '/auth/register', data={'username': 'a', 'password': 'a'}
- )
- print(response.data)
- assert response.headers["Location"] == "/auth/login"
- with app.app_context():
- assert get_db().execute(
- "SELECT * FROM user WHERE username = 'a'",
- ).fetchone() is not None
- ...
- def test_login(client, auth):
- assert client.get('/auth/login').status_code == 200
- response = auth.login()
- assert response.headers["Location"] == "/"
- with client:
- client.get('/')
- assert session['user_id'] == 1
- assert g.user['username'] == 'test'
Bei jedem Test ist der Inhalt von rsponse data nach dem aufruf von client.post
Und bei test_login diesen Fehler, der vielleicht auch Auskunft geben kann.
Quellcode
- client = <FlaskClient <Flask 'inotodo'>>, auth = <tests.conftest.AuthActions object at 0x000001AEBD993FE0>
- def test_login(client, auth):
- assert client.get('/auth/login').status_code == 200
- response = auth.login()
- > assert response.headers["Location"] == "/"
- tests\test_auth.py:34:
- _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
- self = Headers([('Content-Type', 'text/html; charset=utf-8'), ('Content-Length', '167'), ('Vary', 'Cookie')]), key = 'Location'
- _get_mode = False
- def __getitem__(self, key, _get_mode=False):
- if not _get_mode:
- if isinstance(key, int):
- return self._list[key]
- elif isinstance(key, slice):
- return self.__class__(self._list[key])
- if not isinstance(key, str):
- raise BadRequestKeyError(key)
- ikey = key.lower()
- for k, v in self._list:
- if k.lower() == ikey:
- return v
- # micro optimization: if we are in get mode we will catch that
- # exception one stack level down so we can raise a standard
- # key error instead of our special one.
- if _get_mode:
- raise KeyError()
- > raise BadRequestKeyError(key)
- E werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
- .venv\Lib\site-packages\werkzeug\datastructures\headers.py:72: BadRequestKeyError
Diese Pytheon Pakete sind installiert:
Hat jemand eine Idee, was falsch läuft und wie man es beheben kann?
Danke im Vorraus
NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „INOPIAE“ ()