单元测试的Flask

编程入门 行业动态 更新时间:2024-10-11 17:29:41
本文介绍了单元测试的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.sessionmit() 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.sessionmit() 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

本文发布于:2023-10-10 21:54:42,感谢您对本站的认可!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:单元测试   Flask

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!