在 Flask 重定向中测试 URL 参数
Test for URL Params in Flask Redirect
在成功 POST 连接到表单端点后,我使用我的客户端代码可以与之交互的一些 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_client
和 test_request_context
.
上的 Flask 和 Werkzeug 源代码
我只想测试 success
和 id
的 URL 参数在有效 POST.
后是否存在于重定向中
您可以使用 mock's 函数 patch
函数来修补 url_for
捕获提供的参数,然后针对它们进行测试。
这是一个超级简单但包含所有内容的修补 Flask 的 url_for
方法的示例(在 Python 解释器中可以是 运行 原样):
import flask
from unittest.mock import patch
@patch('flask.url_for')
def test(self):
resp = flask.url_for('spam')
self.assert_called_with('spam')
但是,上面的示例仅在您直接导入 Flask 并且不在路由代码中使用 from flask import url_for
时才有效。您必须修补确切的名称空间,它看起来像这样:
@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)
有关详细信息,请查看模拟文档中的 Where to Patch。
在成功 POST 连接到表单端点后,我使用我的客户端代码可以与之交互的一些 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_client
和 test_request_context
.
我只想测试 success
和 id
的 URL 参数在有效 POST.
您可以使用 mock's 函数 patch
函数来修补 url_for
捕获提供的参数,然后针对它们进行测试。
这是一个超级简单但包含所有内容的修补 Flask 的 url_for
方法的示例(在 Python 解释器中可以是 运行 原样):
import flask
from unittest.mock import patch
@patch('flask.url_for')
def test(self):
resp = flask.url_for('spam')
self.assert_called_with('spam')
但是,上面的示例仅在您直接导入 Flask 并且不在路由代码中使用 from flask import url_for
时才有效。您必须修补确切的名称空间,它看起来像这样:
@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)
有关详细信息,请查看模拟文档中的 Where to Patch。