Flask Redirect返回200而不是302

时间:2015-12-28 02:43:09

标签: python flask python-unittest

我正在为Flask应用程序编写单元测试,但我不确定为什么响应会返回状态代码200而不是302.我正在测试的视图是使用重定向,我的帖子设置了follow_redirects=False。 / p>

以下是测试和查看代码:

#test_views.py
def test_can_post_new_engagement(self):
        response = self.client.post(
                    url_for('main.new_engagement'),
                    data={
                        'title': 'Sample Title',
                        'client': 1},
                    follow_redirects=False)
    self.assertEqual(response.status_code, 302)

#views.py
@main.route('/engagement/new', methods=['GET', 'POST'])
def new_engagement():
    form = EngagementForm()
    form.client.choices = [(o.id, o.official_name) for o in
                           Organization.query.order_by('official_name')]
    form.client.choices.insert(0, (0, '--- Select Organization ---'))
    if form.validate_on_submit():
        eng = Engagement(title=form.title.data,
                         client_id=form.client.data)
        db.session.add(eng)
        return redirect(url_for('main.new_pentest'))
    return render_template('engagement_form.html', form=form)

错误:

 FAIL: test_can_post_new_engagement (test_views.NewEngagementView)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
    File "/home/ramces/dev/global_engagement_manager/tests/unit/test_views.py
    ", line 36, in test_can_post_new_engagement
       self.assertEqual(response.status_code, 302)
AssertionError: 200 != 302

2 个答案:

答案 0 :(得分:1)

烧瓶重定向功能 会返回代码为302

的回复
from flask import redirect
print(redirect("some_url").status_code)  # 302

您的测试可能失败,因为您的表单验证失败。 你能确定你确实进入了if-branch吗?

一个问题可能是您的client SelectField(假设您使用wtforms)使用int作为密钥。请确保在字段的构造函数中提供coerce=int

我正在使用烧瓶版 0.10.1

注意:这应该是一个评论,但SO告诉我在评论之前我需要50个代表。但是当然可以发布答案。

答案 1 :(得分:1)

解决

首先,正如Wombatz建议的那样,我没有意识到我的表格没有通过form.validate_on_submit()

经过一些调试后,我意识到我的测试配置中缺少CSRF令牌,因此添加WTF_CSRF_ENABLED = False解决了这个问题。