Pytest терпит неудачу на колбах - PullRequest
0 голосов
/ 29 марта 2019

Я пытался протестировать функцию входа в систему с помощью pytest, но тест не прошел.

На самом деле, настоящая проблема в моем проекте заключается в том, что form.validate_on_submit() всегда False, когда я пытаюсь POST данные для формы входа (все form.field.data это '').

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

Я не включил здесь базу данных, потому что база данных отлично работает в моем реальном проекте, и я хочу выяснить, почему кажется, что никакие данные не могут быть размещены в.

Но когда это произошлоВ этом минимальном проекте, приведенном ниже, возникает другая проблема: код ответа становится 404.

Я установил app.config['WTF_CSRF_ENABLED'] = False как в этом минимальном проекте, так и в моем реальном проекте.

Эта минимальная структура проекта здесь:

.
├── Pipfile
├── Pipfile.lock
├── app.py
├── templates
│   └── login.html
└── tests
    └── test_login.py

test_login.py:

import pytest

from app import create_app


@pytest.fixture(scope='module')
def app():
    app = create_app()
    with app.app_context():
        app.config['WTF_CSRF_ENABLED'] = False
        yield app


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


def test_login(client):
    response = client.post('/login', data={'username': '1', 'password': '1'})
    # response.status_code is 404 here
    assert response.headers['Location'] == 'http://localhost/'

app.py:

from flask import Flask, redirect, render_template, url_for
from flask_wtf import FlaskForm
from wtforms import PasswordField, StringField, SubmitField
from wtforms.validators import DataRequired


class LoginForm(FlaskForm):
    username = StringField(validators=[DataRequired()])
    password = PasswordField(validators=[DataRequired()])
    submit = SubmitField()


def create_app():
    app = Flask('__name__')
    app.config['SECRET_KEY'] = "secretkey"
    return app


app = create_app()


@app.route('/')
def home():
    return 'hello'


@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        return redirect(url_for('home'))
    return render_template('login.html', form=form)

login.html:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <form method="POST">
        {{ form.hidden_tag() }}
        {{ form.username() }}
        {{ form.password() }}
        {{ form.submit() }}
    </form>
</body>

</html>

Виртуальная среда, которую я выбираю, - pipenv и pyenv, а вот мое Pipfile:

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]
pytest = "*"

[packages]
flask-wtf = "*"

[requires]
python_version = "3.7"

1 Ответ

0 голосов
/ 30 марта 2019

Оказывается, я не правильно использую фабричный шаблон.Blueprint следует использовать и зарегистрировать в приложении на заводе.Подробности см. В этом ответе .

...