python – 在Flask重定向中测试URL参数

在成功发布到表单端点后,我使用一些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_client和test_request_context上的Flask和Werkzeug源代码.

我只想测试成功后的URL参数和在有效POST后重定向的id.

最佳答案
这是一个非常简单但包容性的修补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而不是在路径代码中使用flask导入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',id=1)

有关更多信息,请在模拟文档中查看Where to Patch.

相关文章

在这篇文章中,我们深入学习了XPath作为一种常见的网络爬虫技巧。XPath是一种用于定位和选择XML文档中特...
祝福大家龙年快乐!愿你们的生活像龙一样充满力量和勇气,愿你们在新的一年里,追逐梦想,勇往直前,不...
今天在爬虫实战中,除了正常爬取网页数据外,我们还添加了一个下载功能,主要任务是爬取小说并将其下载...
完美收官,本文是爬虫实战的最后一章了,所以尽管本文着重呈现爬虫实战,但其中有一大部分内容专注于数...
JSON是一种流行的数据传输格式,Python中有多种处理JSON的方式。官方的json库是最常用的,它提供了简单...
独立样本T检验适用于比较两组独立样本的均值差异,而配对T检验则适用于比较同一组样本在不同条件下的均...