如何模拟补丁烧瓶请求

问题描述 投票:0回答:1

我有 Flask RestPlus 资源:

def post(self) -> tuple:
    id = self._my_business.store_in_database(request.json)
    return {'id': id}, 201

这是我测试的方法:

def test_post(self):
    request_mock = mock.MagicMock()
    request_mock.json = {'name': 'toto', 'owner': 'titi'}
    with mock.patch("sources.toto.my_resource.request", request_mock):
        self._my_business.store_in_database.return_value = 1
        response = self._my_resource.post()
    self.assertEqual(({'id', 1}, 201), response)

当我运行测试时,出现以下错误:

RuntimeError: Working outside of request context.
既然我已经嘲笑了
request
我不明白问题出在哪里。在资源文件中打印
request
后,它不会返回我的 MagicMoc,而是返回一个真正的
request
对象。

感谢您的回复,祝您有美好的一天!

python flask request mocking
1个回答
0
投票

我团队中的某人也遇到了这个错误。测试客户的评论很有帮助,所以我只是将其移至完整的答案。

  1. 您不需要模拟该请求。只需在调用方法时传入表单数据即可。

  2. 使用将为您处理上下文局部变量的测试客户端。以下是包含 Flask 测试建议的文档:https://flask.palletsprojects.com/en/2.3.x/testing

希望这个示例可以帮助您接近:

import pytest
from sources.toto import my_resource

# next 3 methods are flask testing stuff

@pytest.fixture()
def app():
    app = my_resource()
    app.config.update({
        "TESTING": True,
    })

    # other setup can go here

    yield app

    # clean up / reset resources here


@pytest.fixture()
def client(app):
    return app.test_client()


@pytest.fixture()
def runner(app):
    return app.test_cli_runner()


def test_request_example(client):
    # for form, use data= , json use json=
    response = client.post("/posts", data={'name': 'toto', 'owner': 'titi'})
    assert response.data == {'id', 1}
    assert response.status_code == 201
© www.soinside.com 2019 - 2024. All rights reserved.