我有 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
对象。
感谢您的回复,祝您有美好的一天!
我团队中的某人也遇到了这个错误。测试客户的评论很有帮助,所以我只是将其移至完整的答案。
您不需要模拟该请求。只需在调用方法时传入表单数据即可。
使用将为您处理上下文局部变量的测试客户端。以下是包含 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