Python 如何使用Flask中的表单在视图上测试POST操作
我有一个flask应用程序,它具有如下视图功能:Python 如何使用Flask中的表单在视图上测试POST操作,python,forms,testing,flask,Python,Forms,Testing,Flask,我有一个flask应用程序,它具有如下视图功能: @login_required @app.route('/suspect_tracker/new_list', methods=['GET', 'POST']) def new_list(): form = ListForm() if form.validate_on_submit(): if form.private: privacy_setting = 1 else:
@login_required
@app.route('/suspect_tracker/new_list', methods=['GET', 'POST'])
def new_list():
form = ListForm()
if form.validate_on_submit():
if form.private:
privacy_setting = 1
else:
privacy_setting = 0
new_list = List(name=form.name.data, last_updated=datetime.utcnow(), user_id=g.user.id, private=privacy_setting)
db.session.add(new_list)
db.session.commit()
flash('New list %s added' % new_list.name)
return redirect('/suspect_tracker/' + form.name.data)
else:
flash(form.name.errors)
return render_template('newlist.html', title="Make a new list!", form=form)
from config import basedir
from app import app, db
from app.models import User, List, Suspect, SuspectList
from flask import g
from flask_testing import TestCase
class TestViews(TestCase):
def create_app(self):
app.config['TESTING'] = True
app.config['WTF_CSRF_ENABLED'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'test.db')
self.client = app.test_client()
return app
def setUp(self):
self.app = self.create_app()
db.create_all()
test_user = User(nickname="test")
db.session.add(test_user)
db.session.commit()
g.user = User.query.filter_by(id=1).first()
def tearDown(self):
db.session.remove()
db.drop_all()
def test_new_list_view(self):
self.client.get('/suspect_tracker/new_list/')
form = {'name':'Test', 'private':False}
g.user = User.query.filter_by(id=1).first()
self.client.post('/suspect_tracker/new_list', data=form)
assert List.query.filter_by(name="Test").first() != None
我正试图为它编写一个测试,测试如下:
@login_required
@app.route('/suspect_tracker/new_list', methods=['GET', 'POST'])
def new_list():
form = ListForm()
if form.validate_on_submit():
if form.private:
privacy_setting = 1
else:
privacy_setting = 0
new_list = List(name=form.name.data, last_updated=datetime.utcnow(), user_id=g.user.id, private=privacy_setting)
db.session.add(new_list)
db.session.commit()
flash('New list %s added' % new_list.name)
return redirect('/suspect_tracker/' + form.name.data)
else:
flash(form.name.errors)
return render_template('newlist.html', title="Make a new list!", form=form)
from config import basedir
from app import app, db
from app.models import User, List, Suspect, SuspectList
from flask import g
from flask_testing import TestCase
class TestViews(TestCase):
def create_app(self):
app.config['TESTING'] = True
app.config['WTF_CSRF_ENABLED'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'test.db')
self.client = app.test_client()
return app
def setUp(self):
self.app = self.create_app()
db.create_all()
test_user = User(nickname="test")
db.session.add(test_user)
db.session.commit()
g.user = User.query.filter_by(id=1).first()
def tearDown(self):
db.session.remove()
db.drop_all()
def test_new_list_view(self):
self.client.get('/suspect_tracker/new_list/')
form = {'name':'Test', 'private':False}
g.user = User.query.filter_by(id=1).first()
self.client.post('/suspect_tracker/new_list', data=form)
assert List.query.filter_by(name="Test").first() != None
运行测试后,断言失败,我已经测试过,在运行self.client.post之后,列表不包含新列表,仍然为空。这让我相信提交时form.validate\u返回了false,这让我相信我没有在test\u new\u list\u视图中的self.client.post函数中传递正确的数据。我的问题是,如何在测试函数中正确创建一个ListForm,然后使用self.client.POST发布它以测试新的_list函数
我已经解决了正确发送表单数据的问题,因此现在表单将进行验证,但我不知道如何将g.user设置为模拟用户,因此当我尝试运行测试时,我得到了一个AttributeError:“AnonymousUserMixin”对象没有属性“id”错误。db来自何处?很抱歉,我只是复制了TestView类,而不是整个tests.py文件。我已经添加了tests.py中的导入,但是db是在测试文件的开头从app导入的。