如何在Flask中伪造request.POST和GET参数进行单元测试?

nub*_*ela 41 python unit-testing flask

我想伪造单元测试的请求参数.我怎样才能在Flask中实现这一目标?

pla*_*aes 62

您是否阅读过有关测试的Flask文档

您可以使用以下内容:

self.app.post('/path-to-request', data=dict(var1='data1', var2='data2', ...))
self.app.get('/path-to-request', query_string=dict(arg1='data1', arg2='data2', ...))
Run Code Online (Sandbox Code Playgroud)

Flask的当前开发版本还包括对测试JSON API的支持:

from flask import request, jsonify

@app.route('/jsonapi')
def auth():
    json_data = request.get_json()
    attribute = json_data['attr']
    return jsonify(resp=generate_response(attribute))

with app.test_client() as c:
    rv = c.post('/jsonapi', json={
        'attr': 'value', 'other': 'data'
    })
    json_data = rv.get_json()
    assert generate_response(email, json_data['resp'])
Run Code Online (Sandbox Code Playgroud)

  • @ssilver你可以使用一个dict,但它不是像.post这样的数据:self.app.get('/ endpoint',query_string = params) (13认同)
  • 感谢一个建设性的答案,@ jskulski - 它也帮助了我.尝试一些东西可以告诉你什么不起作用,但它没有告诉你是否有不同的方法可行. (2认同)

Ita*_*ana 30

POST:

self.app.post('/endpoint', data=params)
Run Code Online (Sandbox Code Playgroud)

得到:

self.app.get('/endpoint', query_string=params)
Run Code Online (Sandbox Code Playgroud)


Mat*_*sen 6

如果您喜欢使用test_request_context

import unittest
from myapp import extract_query_params

testapp = flask.Flask(__name__)

class TestFoo(unittest.TestCase):
    def test_happy(self):
        with testapp.test_request_context('?limit=1&offset=2'):
            limit, offset = extract_query_params(['limit', 'offset'])
            self.assertEquals(limit, 1)
            self.assertEquals(offset, 2)
Run Code Online (Sandbox Code Playgroud)

  • `with testapp.test_request_context(headers=h):` 可用于传递 **headers** 而无需提及任何 **url**,这将模拟带有 _default-url_ 的请求 (2认同)