单元测试的Flask-WTF / WTForms验证失败,但没有单元测试 [英] Flask-WTF / WTForms with Unittest fails validation, but works without Unittest

查看:142
本文介绍了单元测试的Flask-WTF / WTForms验证失败,但没有单元测试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我正常运行应用程序,并在浏览器中登录,它的工作原理。但是Unittest不会将我登录到....,它会再次返回登录页面。

print rv.data只是打印登录页面的内容,但它应该打印索引页面的内容,即login_required


如果有帮助, m使用SQLAlchemy作为ORM。
任何人都知道什么是问题?如果需要更多的代码,我会提供。
我试图在这里搜索类似的问题,但没有找到。

 #!flask / bin / python 
导入os
导入unittest
$ b $从配置导入basedir
从应用程序导入应用程序,db $ b $从app.models导入用户,考试,尝试,主题
$ b $ 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):
返回self.app.post('/ login',data = dict(
username = username,
password = password
),follow_redirects = True)

def test_users(self):
u =使用r(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()

...

pre $ app_route('/ login',methods = ['GET ')'
def login():
如果g.user不是None和g.user.is_authenticated():
return redirect(url_for('index'))
$ b $ form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(username = form.username.data).first()
如果用户不是None和form.password.data == user.password:
login_user(用户)
flash(登录成功)
return redirect(request.args .get('next')或者url_for ('index'))
flash('无效密码')
return render_template('login.html',
title ='Sign In',
form = form)

这里是从上面的行回溯form.validate_on_submit

 > /home/gaucan/webdev/projekt2/app/views.py(131)login()
- >如果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()
- >测试(结果)
/usr/lib64/python2.7/unittest/suite.py(70)__ call __()
- >返回self.run(* args,** kwds)
/usr/lib64/python2.7/unittest/suite.py(108)run()
- >测试(结果)
/usr/lib64/python2.7/unittest/suite.py(70)__ call __()
- >返回self.run(* args,** kwds)
/usr/lib64/python2.7/unittest/suite.py(108)run()
- > test(result)
/usr/lib64/python2.7/unittest/case.py(433)__ call __()
- >返回self.run(* args,** kwds)
/usr/lib64/python2.7/unittest/case.py(369)run()
- > testMethod()
/home/gaucan/webdev/projekt2/shit.py(35)test_users()
- > (28)login()
- > ),follow_redirects = True)
/home/gaucan/webdev/projekt2/flask/lib/python2.7/site-packages/werkzeug/test.py(771)post()
- >返回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 __()
- > ;返回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()
- >如果form.validate_on_submit():
(Pdb)

解决方案

您应该设置 WTF_CSRF_ENABLED 不是 CSRF_ENABLED - 现在,Flask-WTForms正在尝试验证您的CSRF令牌,但是您没有提供一个:

 <$ c 
def setUp(self):
app.config ['TESTING'] = True
#错误的键:
#app。 config ['CSRF_ENABLED'] = False
#右键:
app.config ['WTF_CSRF_ENABLED'] = False


When I run app normally and do login in browser, it works. But with Unittest it won't log me in .... , it returns login page again.
Both "print rv.data" just prints content of login page, but it should print content of index page, which is login_required
if it helps, I'm using SQLAlchemy as ORM. Anyone knows what can be problem? If any more code is needed, I will provide. I ve tried to search for similar question here , but didnt find.

#!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 added view login function for you to see...

@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)

here is backtrace from line above 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) 

解决方案

You should set WTF_CSRF_ENABLED not CSRF_ENABLED - right now, Flask-WTForms is trying to validate your CSRF token, but you are not providing one:

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

这篇关于单元测试的Flask-WTF / WTForms验证失败,但没有单元测试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆