处理烧瓶POST单元测试的最佳方法

时间:2016-04-06 20:35:24

标签: python unit-testing flask

我有以下代码,它接受POST请求并处理它。

index.py

@app.route('/route', methods=['POST'])
def route_post():
    try:
        data = request.get_data()
        j = json.loads(data)
    except Exception as e:
    ...

基本上,我想访问request.get_data(),以便我可以更改值。我正在调用如下所示的测试,这很简单。

route_test.py:

def test_route():
    assert(("Bad Request\r\n", 400) == route_post())

但是不允许我设置request.get_data()的值。我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

使用测试客户端将您需要的任何数据发布到路由中。如果data是一个字符串或字节,Werkzeug将直接发送数据,如字节。

from flask import Flask, request

app = Flask(__name__, static_folder=None)

@app.route('/', methods=['POST'])
def index():
    return request.get_data()

c = app.test_client()
r = c.post('/', data='Hello, World!')
print(r.data)  # b'Hello, World!'

答案 1 :(得分:0)

您可以使用模拟对象修补请求对象的方法get_data,该对象返回您要返回的内容。有点像:

from mock import patch

@patch('flask.Request.get_data')
def test_route_post(self, get_deta_mock):
    get_deta_mock.return_value = '{"foo": "bar"}'
    result = route_post()
    assert result['foo'] == 'bar'