【发布时间】:2018-12-18 15:51:03
【问题描述】:
我正在尝试在本地测试我希望部署为 Google Cloud 函数的 Python 函数。这些函数似乎本质上是基于 Flask 的,我发现返回 JSON 的最好方法是使用 Flask 的 jsonify 函数。部署时这似乎工作正常,但我想设置一些本地单元测试,这就是我卡住的地方。只需添加行 import jsonify,会导致以下错误:
RuntimeError: Working outside of application context.
Stackoverflow 上有几篇似乎与此问题相关的帖子,但 Google Cloud Functions 并没有真正遵循 Flask 模式。据我所知,没有应用程序上下文,也没有装饰器。我发现的所有示例都对这个特定的用例没有用处。任何人都可以建议一种构建单元测试的方法,该方法将尊重应用程序上下文并且仍然与此处的 GCF 模式兼容。
我有一个单元测试,我可以分享它,但是当你运行以下命令时,你会看到同样的错误,方法调用在 main 内。
import os
import json
from flask import jsonify
from unittest.mock import Mock
def dummy_request(request):
request_json = request.get_json()
if request_json and 'document' in request_json:
document = request_json['document']
else:
raise ValueError("JSON is invalid, or missing a 'docuemnt' property")
data = document
return jsonify(data)
if __name__ == '__main__':
data = {"document":"This is a test document"}
request = Mock(get_json=Mock(return_value=data), args=data)
result = dummy_request(request)
print(result)
【问题讨论】:
-
我开始走这条路,因为我认为我需要 Flask jsonify 或 Response 方法来为 Google Cloud Function 生成正确的输出。我更习惯于 AWS Lambda,其中每个函数都必须生成 JSON 格式的记录代理格式。从那以后我意识到我可以简单地返回一个 JSON 字符串。至于标题和状态代码,它们可以作为元组的一部分返回,如文档中所示: return ('Hello World!', 200, headers) 所以,对我来说最简单的选择是删除所有 Flask 响应我的功能中的东西并正常测试。
标签: python flask google-cloud-platform google-cloud-functions google-contacts-api