2014-02-05 8 views
9

Wenn ich App normal ausführen und im Browser anmelden, funktioniert es. Aber mit Unitest wird es mich nicht einloggen ...., es gibt die Login-Seite wieder.
Beide "print rv.data" druckt nur Inhalt der Login-Seite, aber es sollte Inhalt der Indexseite drucken, die login_required ist Wenn es hilft, verwende ich SQLAlchemy als ORM. Wer weiß, was kann ein Problem sein? Wenn mehr Code benötigt wird, werde ich zur Verfügung stellen. Ich habe versucht, hier ähnliche Frage zu suchen, fand aber nicht.Flask-WTF/WTForms mit Unittest fehlgeschlagen Validierung, funktioniert aber ohne Unittest

#!flask/bin/python 
import os 
import unittest 

from config import basedir 
from app import app, db 
from app.models import User,Exam,Attempt,Subject 

class TestCase(unittest.TestCase): 
    def setUp(self): 
     app.config['TESTING'] = True 
     app.config['CSRF_ENABLED'] = False 
     app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'test.db') 
     self.app = app.test_client() 
     db.create_all() 

    def tearDown(self): 
     db.session.remove() 
     db.drop_all() 

    def login(self, username, password): 
     return self.app.post('/login', data=dict(
      username=username, 
      password=password 
     ), follow_redirects=True) 

    def test_users(self): 
     u = User(username = 'gaucan', password = 'gau') 
     db.session.add(u) 
     db.session.commit() 

     rv = self.login('gaucan','gau') 
     print rv.data 
     rv = self.app.get('/',follow_redirects=True) 
     print rv.data 

if __name__ == '__main__': 
    unittest.main() 

I Ansicht Login-Funktion hinzugefügt, damit Sie sehen ...

@app.route('/login', methods = ['GET', 'POST']) 
def login(): 
if g.user is not None and g.user.is_authenticated(): 
    return redirect(url_for('index')) 

form = LoginForm() 
if form.validate_on_submit(): 
    user = User.query.filter_by(username = form.username.data).first() 
    if user is not None and form.password.data == user.password: 
     login_user(user) 
     flash("Logged in successfully.") 
     return redirect(request.args.get('next') or url_for('index')) 
    flash('Invalid password') 
return render_template('login.html', 
    title = 'Sign In', 
    form = form) 

hier ist Backtrace aus der Leitung über form.validate_on_submit

> /home/gaucan/webdev/projekt2/app/views.py(131)login() 
-> if form.validate_on_submit(): 
(Pdb) bt 
    /home/gaucan/webdev/projekt2/shit.py(41)<module>() 
-> unittest.main() 
    /usr/lib64/python2.7/unittest/main.py(95)__init__() 
-> self.runTests() 
    /usr/lib64/python2.7/unittest/main.py(232)runTests() 
-> self.result = testRunner.run(self.test) 
    /usr/lib64/python2.7/unittest/runner.py(151)run() 
-> test(result) 
    /usr/lib64/python2.7/unittest/suite.py(70)__call__() 
-> return self.run(*args, **kwds) 
    /usr/lib64/python2.7/unittest/suite.py(108)run() 
-> test(result) 
    /usr/lib64/python2.7/unittest/suite.py(70)__call__() 
-> return self.run(*args, **kwds) 
    /usr/lib64/python2.7/unittest/suite.py(108)run() 
-> test(result) 
    /usr/lib64/python2.7/unittest/case.py(433)__call__() 
-> return self.run(*args, **kwds) 
    /usr/lib64/python2.7/unittest/case.py(369)run() 
-> testMethod() 
    /home/gaucan/webdev/projekt2/shit.py(35)test_users() 
-> rv = self.login('gaucan','gau') 
    /home/gaucan/webdev/projekt2/shit.py(28)login() 
->), follow_redirects=True) 
    /home/gaucan/webdev/projekt2/flask/lib/python2.7/site-packages/werkzeug/test.py(771)post() 
-> return self.open(*args, **kw) 
    /home/gaucan/webdev/projekt2/flask/lib/python2.7/site-packages/flask/testing.py(108)open() 
-> follow_redirects=follow_redirects) 
    /home/gaucan/webdev/projekt2/flask/lib/python2.7/site-packages/werkzeug/test.py(735)open() 
-> response = self.run_wsgi_app(environ, buffered=buffered) 
    /home/gaucan/webdev/projekt2/flask/lib/python2.7/site-packages/werkzeug/test.py(658)run_wsgi_app() 
-> rv = run_wsgi_app(self.application, environ, buffered=buffered) 
    /home/gaucan/webdev/projekt2/flask/lib/python2.7/site-packages/werkzeug/test.py(854)run_wsgi_app() 
-> app_iter = app(environ, start_response) 
    /home/gaucan/webdev/projekt2/flask/lib/python2.7/site-packages/flask/app.py(1836)__call__() 
-> return self.wsgi_app(environ, start_response) 
    /home/gaucan/webdev/projekt2/flask/lib/python2.7/site-packages/flask/app.py(1817)wsgi_app() 
-> response = self.full_dispatch_request() 
    /home/gaucan/webdev/projekt2/flask/lib/python2.7/site-packages/flask/app.py(1475)full_dispatch_request() 
-> rv = self.dispatch_request() 
    /home/gaucan/webdev/projekt2/flask/lib/python2.7/site-packages/flask/app.py(1461)dispatch_request() 
-> return self.view_functions[rule.endpoint](**req.view_args) 
> /home/gaucan/webdev/projekt2/app/views.py(131)login() 
-> if form.validate_on_submit(): 
(Pdb) 

+0

Ist der Benutzer bereits in der Datenbank vorhanden? –

+0

@Sean: Ja ist es. Es ist seltsam, dass es funktioniert, wenn normal ausgeführt wird, aber nicht in Unittests ... Ich habe jetzt View Login-Funktion hinzugefügt, wenn es hilft .. – user3263155

+0

Ich dachte, eine Menge von "Print-Nachrichten": D das Problem ist, dass form.validate_on_submit() FALSE zurückgibt .... aber ich weiß nicht warum ... vielleicht mit Flask-Login, Unittesting muss anders gemacht werden? – user3263155

Antwort

27

Sie WTF_CSRF_ENABLED nicht CSRF_ENABLED setzen sollte - jetzt Flask-WTForms versucht, Ihr CSRF-Token zu validieren, Sie stellen jedoch keines zur Verfügung:

class TestCase(unittest.TestCase): 
    def setUp(self): 
     app.config['TESTING'] = True 
     # Wrong key: 
     # app.config['CSRF_ENABLED'] = False 
     # Right key: 
     app.config['WTF_CSRF_ENABLED'] = False 
+0

yay danke! Ich liebe dich, wie hast du herausgefunden, wo das Problem war? – user3263155

+0

@ user3263155 - Ich hatte das gleiche Problem schon selbst - sie haben erst vor kurzem den Schlüssel geändert. –

+0

Vielen Dank dafür, wenn ich die Abstimmung verdoppeln könnte würde ich! –