我有以下烧瓶应用。
# 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'}
答案 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']
你能试试这个代码吗?