Flask 单元测试:无法模拟发布请求中的函数

时间:2021-06-22 07:29:03

标签: python unit-testing flask mocking

我有以下烧瓶应用。

# app.py

from flask import Flask, request
from predict import query_sku

app = Flask(__name__)

@app.route("/predict", methods=["POST"])
def predict():
    content = request.json
    max_results = content["resultSize"]
    input_sku_list = content["sku"]

    skus = query_sku(input_sku_list, max_results)
    return {"sku": skus}

if __name__ == "__main__":
    app.run()

我使用 pytest 为其编写了单元测试,并尝试使用 query_sku 模拟 unittest.mock 函数。

import sys
from unittest.mock import Mock

import pytest

import app

def test_api_mocked_model():
    sys.modules["predict"] = Mock()
    from predict import query_sku
    query_sku.return_value = "dummy"

    with app.app.test_client() as client:
        response = client.post('/predict', json={"resultSize":10,"sku": "x"}).json

    assert response == {"sku": "dummy"}
    del sys.modules['predict']

但是我无法在请求中模拟该函数。它只是给出了以下断言错误。

>       assert response == {"sku": "dummy"}
E       AssertionError: assert None == {'sku': 'dummy'}
E         +None
E         -{'sku': 'dummy'}

tests/unit_tests/test_api.py:34: AssertionError

我怎样才能让它工作?

[编辑]

我在下面的 query_sku 函数中添加了。故意返回一个与 Mock 函数 return_value 不同的值。

# predict.py
def query_sku(input_sku_list, topn):
    return "actual function"

但是unit-test还是从实际的函数中查询,如下图。

assert response == {"sku": "dummy"}
E       AssertionError: assert {'sku': 'actual function'} == {'sku': 'dummy'}
E         Differing items:
E         {'sku': 'actual function'} != {'sku': 'dummy'}

1 个答案:

答案 0 :(得分:1)

from unittest.mock import MagicMock

def test_api_mocked_model():
     ## sys.modules["predict"] = Mock() ## why sys module ?
    from predict import query_sku
    query_sku = MagicMock(return_value="dummy") # mock directly 
  


    with app.app.test_client() as client:
        response = client.post('/predict', json={"resultSize":10,"sku": "x"}).json

    assert response == {"sku": "dummy"}
    del sys.modules['predict']

你能试试这个代码吗?