簡體   English   中英

如何使用 pytest 測試處理請求的 Flask(非路由)函數?

[英]How to test a Flask (non-route) function that processes a request, using pytest?

上下文:我有兩個處理相同請求數據的 Flask 路由(一個交互,一個作為 API)。 為了保持我的代碼干燥,我想編寫一個函數process_post_request()

  1. 接受來自每個路由的輸入參數中的請求,
  2. 解析請求,
  3. 返回路由可以使用的結果。

例如,在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM