Зачем использовать Flask app.test_client (), а не запросы. Сессия () для тестирования - PullRequest
0 голосов
/ 26 августа 2018

Если requests.Session() может обрабатывать куки и делает почти все, что делает app.test_client().Тогда зачем использовать app.test_client()?

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

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

Тестовый клиент

app.test_client()

Позволяет вам получить доступ к локальным контекстам через его менеджер контекста. Это очень полезно при попытке получить доступ к переменным в _request_ctx_stack ( контекст запроса стек). например контекстные request и session локальные.

Некоторые расширения также хранят переменные в _request_ctx_stack. например flask_login хранит current_user и flask_stateless_auth хранит current_stateless_user в стеке контекста запроса.

from flask import request
from flask_stateless_auth import current_stateless_user

with app.test_client() as c:
  test_path = '/resource_for_authenticated_users'
  c.get(test_path)
  assert request.path == test_url
  assert flask.session is not None # You can also access the session context local from here
  assert current_stateless_user is not None

Если бы он вызывался без диспетчера контекста test_client(), он выдал бы ошибку времени выполнения при попытке доступа к локальному контексту запроса после того, как _request_ctx_stack был извлечен. Кроме того, current_stateless_user вернет None

Контекст приложения

app.app_context()

Аналогично, вы можете получить доступ к переменным, которые хранятся в контексте приложения через менеджер контекста app.app_context(), например:

from my_app.db import db # db connections are commonly stored on the `_app_ctx_stack`

with app.app_context():
  db.create_tables()
  assert db.session
  assert db.query.MyTable.all()

Вы также можете получить доступ к глобальной переменной контекста приложения (обычно используется для хранения глобальных переменных, связанных с приложением которые не будут использоваться в нескольких запросах, таких как session global)

with app.app_context():
  assert g.my_global_app_var

Контекст запроса теста

test_request_context()

Затем у вас есть app.test_request_context() менеджер контекста, который используется для временной активации контекста запроса. Это лучше всего объяснить официальными документами .

Контекст транзакции сеанса

app.test_client().session_transaction()

Наконец, есть менеджер контекста session_transaction(). Обычно это используется для изменения объекта сеанса. Это должно быть вложено в app.test_client().

Когда вызывается метод __exit__(), сессия надежно сохраняется.

пример из документов :

with app.test_client() as c:
     with c.session_transaction() as sess:
         sess['a_key'] = 'a value'

    # once this is reached the session was stored
0 голосов
/ 27 августа 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...