在Flask重定向中测试URL参数

时间:2018-01-19 02:13:58

标签: python flask werkzeug

成功发布到表单端点后,我使用一些URL客户端代码可以与之交互的URL参数重定向回同一个端点。

@bp.route('/submit', methods=['GET', 'POST'])
def submit():
    form = SubmissionForm()
    labels = current_app.config['TRELLO_LABELS']

    if form.validate_on_submit():

        submission = Submission().create(
            title=form.data['title'], email=form.data['email'], card_id=card.id, card_url=card.url)

        # reset form by redirecting back and setting the URL params
        return redirect(url_for('bp.submit', success=1, id=card.id))

    return render_template('submit.html', form=form)

但我遇到了一些试图为此代码编写测试的问题,因为我无法弄清楚如何测试这些URL参数是否在我的重定向URL上。我不完整的测试代码是:

import pytest

@pytest.mark.usefixtures('session')
class TestRoutes:

    def test_submit_post(self, app, mocker):
        with app.test_request_context('/submit',
            method='post',
            query_string=dict(
                email='email@example.com',
                title='foo',
                pitch='foo',
                format='IN-DEPTH',
                audience='INTERMEDIATE',
                description='foo',
                notes='foo')):
            assert resp.status_code == 200

我尝试了几种不同的方法来测试它。无论是否有上下文管理器,我都在test_clienttest_request_context深入挖掘Flask和Werkzeug源代码。

我只想测试有效POST后重定向时successid的网址参数是否存在。

2 个答案:

答案 0 :(得分:3)

这是修补Flask的import flask from unittest.mock import patch @patch('flask.url_for') def test(self): resp = flask.url_for('spam') self.assert_called_with('spam') 方法的一个非常简单但包容的示例(可以在Python解释器中按原样运行):

from flask import url_for


但是,上述示例仅在您直接导入Flask而不在路由代码中使用@patch('application.routes.url_for') def another_test(self, client): # Some code that envokes Flask's url_for, such as: client.post('/submit', data={}, follow_redirects=True) self.assert_called_once_with('bp.submit', success=1, id=1) 时才有效。您必须修补确切的命名空间,如下所示:

keybindings.json

有关详情,请查看模拟文档中的Where to Patch

答案 1 :(得分:0)

您可以使用mock's函数patch函数来修补url_for捕获提供的参数,然后对其进行测试。