首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法模拟Flask Unitest中的api调用内部函数

无法模拟Flask Unitest中的api调用内部函数
EN

Stack Overflow用户
提问于 2019-07-14 20:15:41
回答 1查看 244关注 0票数 1

我无法在Flask Rest API测试中模拟API调用函数调用。我使用的是unittest和pytest模块。

代码如下:

rest_api.py

代码语言:javascript
复制
@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

代码语言:javascript
复制
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:所谓直接函数调用,我的意思是通过在测试脚本中直接导入并执行函数来测试函数。请帮帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-19 14:50:54

通过创建另一个模拟函数解决了这个问题。

代码语言:javascript
复制
class FakedResponse:
    """Fake Response2."""

    status_code = 200

    @staticmethod
    def json():
        """Json Response."""
        return response

然后通过以下方式修改实际测试函数

代码语言:javascript
复制
@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')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57027311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档