2016-06-01 8 views
2

Ich bin ratlos, einen POST zu testen, um eine Kategorie zu der Datenbank hinzuzufügen, wo ich Flask_WTF für Validierung und CSRF-Schutz verwendet habe. Für die CRUD-Operationen pm meine Website. Ich habe Flask, Flask_WTF und Flask-SQLAlchemy verwendet. Es ist mein erstes unabhängiges Projekt, und ich finde mich etwas verloren, wie man die Flask-WTForm validate_on_submit-Funktion testen kann.Einen POST testen, der Flask-WTF verwendet validate_on_submit

Hier sind die Modelle:

class Users(db.Model): 
    id = db.Column(db.Integer, primary_key=True, unique=True) 
    name = db.Column(db.String(80), nullable=False) 
    email = db.Column(db.String(250), unique=True) 

class Category(db.Model): 
    id = db.Column(db.Integer, primary_key=True, unique=True) 
    name = db.Column(db.String(250), nullable=False, unique=True) 
    users_id = db.Column(db.Integer, db.ForeignKey('users.id')) 

Hier ist die Form:

class CategoryForm(Form): 
    name = StringField(
     'Name', [validators.Length(min=4, max=250, message="name problem")]) 

Und hier ist der Controller:

@category.route('/category/add', methods=['GET', 'POST']) 
@login_required 
def addCategory(): 
    """ Add a new category. 
     Returns: Redirect Home. 
    """ 
    # Initiate the form. 
    form = CategoryForm() 
    # On POST of a valid form, add the new category. 
    if form.validate_on_submit(): 
     category = Category(
      form.name.data, login_session['users_id']) 
     db.session.add(category) 
     db.session.commit() 
     flash('New Category %s Successfully Created' % category.name) 
     return redirect(url_for('category.showHome')) 
    else: 
     # Render the form to add the category. 
     return render_template('newCategory.html', form=form) 

Wie kann ich einen Test für die if-Anweisung schreiben mit die validate_on_submit Funktion?

Antwort

1

Mit py.test und einem conftest.py, empfohlen von Delightful testing with pytest and SQLAlchemy, folgt hier ein Test, der die hinzugefügte Kategorie bestätigt.

def test_add_category_post(app, session): 
    """Does add category post a new category?""" 
    TESTEMAIL = "[email protected]" 
    TESTUSER = "Joe Test" 
    user = Users.query.filter(Users.email==TESTEMAIL).first() 
    category = Category(name="Added Category", users_id=user.id) 
    form = CategoryForm(formdata=None, obj=category) 
    with app.test_client() as c: 
     with c.session_transaction() as sess: 
      sess['email'] = TESTEMAIL 
      sess['username'] = TESTUSER 
      sess['users_id'] = user.id 
      response = c.post(
       '/category/add', data=form.data, follow_redirects=True) 
    assert response.status_code == 200 
    added_category = Category.query.filter(
     Category.name=="Added Category").first() 
    assert added_category 
    session.delete(added_category) 
    session.commit() 

Beachten Sie, dass die neue Kategorie einer Variablen zugewiesen und dann zum Erstellen eines Formulars verwendet wird. Die Daten des Formulars werden im Post verwendet.

+0

Ich hatte unnötig irritiert, wie die WTForm-Klasse funktionierte. Nachdem ich die Quelle von Flask-WTF und WTFrom überprüft hatte, konnte ich klarstellen, dass Flask-WTFs validate_on_submit() einfach Flask-WTFs is_submitted() und WTForm validate() ist. is_submitted() prüft auf die Antwort und die POST- oder PUT-Methode. –

+0

Ich würde mich über die Eingabe von einem erfahrenen Benutzer freuen. Wird die Kategorie in das Formular eingefügt und dann das Formular als Postdaten unnötig? Danke im Voraus. –