我有一个烧瓶应用程序,它具有如下所示的视图功能:
@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之后,List没有包含新列表,并且仍然是空的 . 这让我相信form.validate_on_submit()返回false,这让我相信我没有在test_new_list_view()的self.client.post()函数中传递正确的数据 . 我的问题是,如何在测试函数中正确创建ListForm(),然后使用self.client.post()对其进行POST以测试new_list()函数?
我已经修复了正确发送表单数据的问题,所以现在表单验证但我不知道如何将g.user设置为模拟用户,因此当我尝试运行测试时,我得到一个“AttributeError: 'AnonymousUserMixin'对象没有属性'id'“错误 .