Настройка (издевательский) заголовков запросов для приложения Flask unit test - программирование
Подтвердить что ты не робот

Настройка (издевательский) заголовков запросов для приложения Flask unit test

Кто-нибудь знает, как установить (mock) User-Agent объекта запроса, предоставленного FLask (Werkzeug) во время модульного тестирования?

В настоящее время, когда я пытаюсь получить данные, такие как request.headers ['User-Agent'], KeyError возникает, поскольку Flask test_client() не устанавливает их. (См. Частичную трассировку стека ниже)

При попытке получить User-Agent из объекта запроса в проекте Flask во время модульного тестирования возникает KeyError.

File "/Users/me/app/rest/app.py", line 515, in login
    if request.headers['User-Agent']:
File "/Users/me/.virtualenvs/app/lib/python2.7/site-packages/werkzeug/datastructures.py", line 1229, in __getitem__
    return self.environ['HTTP_' + key]
    KeyError: 'HTTP_USER_AGENT'

- ОБНОВЛЕНИЕ -

Наряду с принятым ниже решением, подсказка environment_base приведет меня к этому другому SO решению. Предпосылка этого решения заключается в создании класса-оболочки для приложения Flask и переопределения метода вызов, чтобы автоматически устанавливать переменные среды. Таким образом, переменные устанавливаются для всех вызовов. Итак, решение, которое я завершил, это создание этого прокси-класса:

class FlaskTestClientProxy(object):
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        environ['REMOTE_ADDR'] = environ.get('REMOTE_ADDR', '127.0.0.1')
        environ['HTTP_USER_AGENT'] = environ.get('HTTP_USER_AGENT', 'Chrome')
        return self.app(environ, start_response)

И затем заверяем контейнер WSGI этим прокси:

app.wsgi_app = FlaskTestClientProxy(app.wsgi_app)
test_client = app.test_client()
4b9b3361

Ответ 1

Вам нужно передать environ_base при вызове get() или post(). Например.

client = app.test_client()
response = client.get('/your/url/', 
                      environ_base={'HTTP_USER_AGENT': 'Chrome, etc'})

Тогда ваш request.user_agent должен быть тем, что вы проходите, и вы можете получить к нему доступ через request.headers['User-Agent'].

Подробнее см. http://werkzeug.pocoo.org/docs/test/#testing-api.