[英]How to test a Flask (non-route) function that processes a request, using pytest?
上下文:我有兩個處理相同請求數據的 Flask 路由(一個交互,一個作為 API)。 為了保持我的代碼干燥,我想編寫一個函數process_post_request()
例如,在 views.py 中:
@app.route('/interactive', methods=['GET', 'POST'])
def interactive():
if request.method == 'POST':
sum, product = process_post_request(request)
# present the results on a web page
@app.route('/api', methods=['GET', 'POST'])
def api():
if request.method == 'POST':
sum, product = process_post_request(request)
# return the results so that JavaScript can parse them
def process_post_request(request):
param1 = request.form.get('param1')
param2 = request.form.get('param2')
sum = param1 + param2
product = param1 * param2
return sum, product
問題:如何為process_post_request()
編寫 pytest? 問題是,如果我創建一個“請求”並嘗試將其傳遞給process_post_request()
,則請求會轉到路由,因此該路由會返回結果。 例如,在 views_test.py 中:
import pytest
@pytest.fixture
def client():
"""Create a client to make requests from"""
with app.test_client() as client:
with app.app_context():
pass
yield client
def test_process_post_request():
request = client.post('/interactive', data={'param1': 5, 'param2': 7})
sum, product = process_post_request(request)
assert sum == 12
因為request
返回響應,所以 pytest 拋出這個錯誤:
> request = client.post('/interactive', data={'param1': 5, 'param2': 7})
E AttributeError: 'function' object has no attribute 'post'
我創建了一個應用程序路由來返回逗號分隔的參數:
@app.route('/pass-through', methods = ['GET', 'POST'])
def pass_through():
if request.method == 'POST':
params = process_post_request(request)
return ','.join(params)
然后測試該應用程序路由:
def test_process_post_request():
with app.test_client() as client:
response = client.post('/pass-through', data={'param1': 5, 'param2': 7})
sum, product = response.data.decode().split(',')
assert sum == 12
其中decode()
從字節轉換為字符串。
這不是最令人滿意的解決方案,因為它確實測試了應用程序路由,因此它依賴於使用與process_post_request()
相同的參數名稱的應用程序路由函數pass_through()
process_post_request()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.