无法在 Flask Unitest 中模拟 api 调用内部函数
Unable to mock api call inner Function in Flask Unitest
我无法在 Flask Rest API 测试中模拟 API 调用函数调用。
我正在使用 unittest 和 pytest 模块。
代码如下:
rest_api.py
@app.route('/api/v1/recommender', methods=['POST'])
def recommender():
"""Handle POST requests that are sent to /api/v1/recommender REST API endpoint."""
r = {'recommendation': 'failure', 'external_request_id': None}
metrics_payload = {
'pid': os.getpid(),
'hostname': os.environ.get("HOSTNAME"),
'endpoint': request.endpoint,
'request_method': request.method,
'status_code': 200
}
input_json = request.get_json()
try:
persist = request.args.get('persist', 'true') == 'true'
r = RecommendationTask().execute(input_json, persist=persist,
check_license=check_license)
except Exception as e:
r = {
'recommendation': 'unexpected error',
'external_request_id': input_json.get('external_request_id'),
'message': '%s' % e
}
metrics_payload['status_code'] = 500
return flask.jsonify(r), 200
test_rest_api.py
import pytest
from src.rest_api import app
@pytest.fixture
def client():
"""Provide the client session used by tests."""
with app.test_client() as client:
yield client
@mock.patch('src.recommender.RecommendationTask.execute', side_effect=None, return_result=None)
def test_recommendation_api_endpoint(_mock_object, client):
"""Check the /recommender REST API endpoint."""
rec_resp = client.post(api_route_for("recommender"),
data=json.dumps(payload), content_type='application/json')
我无法模拟 src.recommender.RecommendationTask.execute
函数。
模拟在直接功能测试中工作得很好,但在 API 调用中却不行。
PS:通过直接函数调用,我的意思是通过在测试脚本中立即导入和执行它们来测试函数。
请帮忙。
通过创建另一个模拟函数解决了这个问题。
class FakedResponse:
"""Fake Response2."""
status_code = 200
@staticmethod
def json():
"""Json Response."""
return response
然后通过
修改实际测试函数
@mock.patch('src.recommender.RecommendationTask.execute', side_effect=None, return_result=None)
def test_recommendation_api_endpoint(_mock_object, client):
"""Check the /recommender REST API endpoint."""
r.cursor = FakedResponse()
rec_resp = client.post(api_route_for("recommender"),
data=json.dumps(payload), content_type='application/json')
我无法在 Flask Rest API 测试中模拟 API 调用函数调用。 我正在使用 unittest 和 pytest 模块。
代码如下:
rest_api.py
@app.route('/api/v1/recommender', methods=['POST'])
def recommender():
"""Handle POST requests that are sent to /api/v1/recommender REST API endpoint."""
r = {'recommendation': 'failure', 'external_request_id': None}
metrics_payload = {
'pid': os.getpid(),
'hostname': os.environ.get("HOSTNAME"),
'endpoint': request.endpoint,
'request_method': request.method,
'status_code': 200
}
input_json = request.get_json()
try:
persist = request.args.get('persist', 'true') == 'true'
r = RecommendationTask().execute(input_json, persist=persist,
check_license=check_license)
except Exception as e:
r = {
'recommendation': 'unexpected error',
'external_request_id': input_json.get('external_request_id'),
'message': '%s' % e
}
metrics_payload['status_code'] = 500
return flask.jsonify(r), 200
test_rest_api.py
import pytest
from src.rest_api import app
@pytest.fixture
def client():
"""Provide the client session used by tests."""
with app.test_client() as client:
yield client
@mock.patch('src.recommender.RecommendationTask.execute', side_effect=None, return_result=None)
def test_recommendation_api_endpoint(_mock_object, client):
"""Check the /recommender REST API endpoint."""
rec_resp = client.post(api_route_for("recommender"),
data=json.dumps(payload), content_type='application/json')
我无法模拟 src.recommender.RecommendationTask.execute
函数。
模拟在直接功能测试中工作得很好,但在 API 调用中却不行。
PS:通过直接函数调用,我的意思是通过在测试脚本中立即导入和执行它们来测试函数。 请帮忙。
通过创建另一个模拟函数解决了这个问题。
class FakedResponse:
"""Fake Response2."""
status_code = 200
@staticmethod
def json():
"""Json Response."""
return response
然后通过
修改实际测试函数@mock.patch('src.recommender.RecommendationTask.execute', side_effect=None, return_result=None)
def test_recommendation_api_endpoint(_mock_object, client):
"""Check the /recommender REST API endpoint."""
r.cursor = FakedResponse()
rec_resp = client.post(api_route_for("recommender"),
data=json.dumps(payload), content_type='application/json')