Ошибки контекста приложения при локальном тестировании (Python) облачной функции Google - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь локально протестировать функцию Python, которую я надеюсь развернуть как облачную функцию Google.Эти функции, по-видимому, в основном основаны на Flask, и я обнаружил, что лучший способ вернуть JSON - использовать функцию Flask jsonify.Кажется, это работает нормально при развертывании, но я хочу настроить некоторые локальные модульные тесты, и вот где я застрял.Простое добавление строки для импорта jsonify приводит к следующей ошибке:

RuntimeError: Working outside of application context.

В Stackoverflow есть несколько публикаций, которые, по-видимому, имеют отношение к этой проблеме, но функции облака Google в действительности не следуют шаблону Flask.Насколько я могу судить, нет контекста приложения, и нет декораторов.Все примеры, которые я нашел, не были полезны для этого конкретного случая использования.Может ли кто-нибудь предложить метод построения модульного теста, который будет учитывать контекст приложения и все же соответствовать шаблону GCF здесь.

У меня есть unittest, которым я могу поделиться, но вы увидите ту же ошибку, когда вызапустите следующую процедуру с вызовом метода внутри 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)

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Вам не нужно проверять, работает ли 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()
0 голосов
/ 18 декабря 2018

Я бы порекомендовал вам взглянуть на документацию Flask о том, как тестировать приложения Flask , там довольно хорошо описано, как настроить тест и получить контекст приложения.

PS jsonify требуется контекст приложения, но json.dumps - нет.Может быть, вы можете использовать последний?

...