[英]Flask test form submission
Im trying to write a test for some form that writes data to my database.我试图为某种将数据写入我的数据库的表单编写测试。 I don't know why it doesn't work.
我不知道为什么它不起作用。
route:路线:
@admin.route('/session/new', methods=['POST', 'GET']) @login_required def new_session(): form = AddSession() if form.validate_on_submit(): print(form.name.data) print(request) add_session = Session(name=form.name.data, start_date=form.start_date.data, end_date=form.end_date.data) db.session.add(add_session) db.session.commit() flash('A session has been successfully added!', 'success') return redirect(url_for('admin.sessions_overview')) return render_template('sessions/new_session.html', title='Add Session', form=form)
test:测试:
class FlaskClientTestCase(unittest.TestCase):
类 FlaskClientTestCase(unittest.TestCase):
def setUp(self): self.app = create_app('testing') self.app_context = self.app.app_context() self.app_context.push() db.create_all() populate_db(db) self.client = self.app.test_client(use_cookies=True) def tearDown(self): db.session.remove() db.drop_all() self.app_context.pop() def test_new_session(self): response = self.client.post('/login', data={ 'username': 'joshn', 'password': '123' }, follow_redirects=True) self.assertEqual(response.status_code, 200) session_data = { 'name': 'test_session', 'start_date': date(2019, 7, 20), 'end_date': date(2019, 7, 21) } response = self.client.post('/session/new', data={ 'name': 'test_session', 'start_date': date(2019, 7, 20), 'end_date': date(2019, 7, 21) }) self.assertEqual(response.status_code, 200, "Form wasn't submitted") # Checks the form submission was valid test_s = Session.query.filter_by(name='test_session').first() self.assertIsNotNone(test_s, "Session wasn't added to database") self.assertEqual(session_data['name'], test_s.name, "Data wasn't written properly to db") self.assertEqual(session_data['start_date'], test_s.start_date, "Data wasn't written properly to db") self.assertEqual(session_data['end_date'], test_s.end_date, "Data wasn't written properly to db")
error message:错误信息:
Traceback (most recent call last): File "tests/test_admin.py", line 56, in test_new_session self.assertIsNotNone(test_s, "Session wasn't added to database") AssertionError: unexpectedly None : Session wasn't added to database
回溯(最近一次调用):文件“tests/test_admin.py”,第 56 行,在 test_new_session self.assertIsNotNone(test_s,“会话未添加到数据库”)断言错误:意外无:会话未添加到数据库
EDIT: ok i added an else to the route, but now i get a response code 400, and when i checked the post request was empty.编辑:好的,我在路由中添加了一个 else,但现在我得到了一个响应代码 400,当我检查 post 请求是空的。
The updated route:更新路线:
def new_session():
form = AddSession()
if form.validate_on_submit():
print(form.name.data)
print(request)
add_session = Session(name=form.name.data,
start_date=form.start_date.data,
end_date=form.end_date.data)
db.session.add(add_session)
db.session.commit()
flash('A session has been successfully added!', 'success')
return redirect(url_for('admin.sessions_overview'))
else:
print(request.method)
if request.method == 'POST':
args = request.args
print(args)
add_session = Session(name=args['name'],
start_date=args['start_date'],
end_date=args['end_date'])
db.session.add(add_session)
db.session.commit()
return Response(status=302)
return render_template('sessions/new_session.html', title='Add Session', form=form)
The message:消息:
Traceback (most recent call last):
File "tests/test_admin.py", line 53, in test_new_session
self.assertEqual(response.status_code, 302, "Form wasn't submitted") # Checks the form submission was valid
AssertionError: 400 != 302 : Form wasn't submitted
If form is not validated on submit, new_session()
will return render_template
which returns 200
as status_code
如果提交时未验证表单,则
new_session()
将返回render_template
,该new_session()
返回200
作为status_code
You need an else
to check when the form is not validated.您需要使用
else
来检查表单何时未验证。 There might be for example a csrf token as a hidden input or anything else and you have to display form errors to know the reason.例如,可能有一个 csrf 令牌作为隐藏输入或其他任何东西,您必须显示表单错误才能知道原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.