应用上下文错误在本地测试(Python)Google云功能时



我正在尝试本地测试一个我希望将其部署为Google Cloud功能的Python功能。这些功能似乎本质上是基于烧瓶的,我发现返回JSON的最佳方法是使用Blask的JSONIFY功能。部署时,这似乎很好,但是我想设置一些本地单元测试,这是我卡住的地方。只需添加以导入jsonify的行,会导致以下错误:

RuntimeError: Working outside of application context.

Stackoverflow上似乎有几篇与此问题相关的帖子,但是Google Cloud功能并没有真正遵循烧瓶模式。据我所知,没有应用程序上下文,也没有装饰器。我发现的所有示例对此特定用例都没有用。任何人都可以提出一种构建单元测试的方法,该测试将尊重应用程序上下文,并且仍然使用GCF模式进行操作。

我有一个Untiment,我可以共享,但是在运行以下内容时,您会看到相同的错误,并在 main> 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是否按预期工作,对吗?这是第三方功能。

您实际试图测试的是使用正确的数据调用了flask.jsonify,因此您只需修补flask.jsonify,并就是否称为模拟的声明:

import flask
from unittest.mock import Mock, patch
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 flask.jsonify(data)

@patch('flask.jsonify')
def test(mock_jsonify):
    data = {"document": "This is a test document"}
    request = Mock(get_json=Mock(return_value=data), args=data)
    dummy_request(request)
    mock_jsonify.assert_called_once_with("This is a test document")

if __name__ == '__main__':
    test()

我建议您查看有关如何测试烧瓶应用程序的烧瓶文档,它描述了如何设置测试并获取应用程序上下文。

P.S。jsonify需要应用程序上下文,但json.dumps不需要。也许您可以使用后者?

我遇到了同一问题。正如您所说的那样,烧瓶测试似乎不太适合云功能,我对代码的工作方式感到满意,因此不想更改它。在测试的设置()中添加应用程序上下文,然后将其用于对我有用的所需调用。这样的东西...

import unittest
import main
from flask import Flask
class TestSomething(unittest.TestCase):
    def setUp(self):
        self.app = Flask(__name__)
    def test_something(self):      
        with self.app.app_context():
            (body, code) = main.request_something()
        self.assertEqual(200, code, "The request did not return a successful response")
    if __name__ == '__main__':
        unittest.main()

相关内容

  • 没有找到相关文章

最新更新