简体   繁体   English

Flask 测试表单提交

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM