Несогласованное поведение между хранилищем реального сеанса Flask и test_request_context во время тестов.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Несогласованное поведение между хранилищем реального сеанса Flask и test_request_context во время тестов.

Сообщение Anonymous »

Я использую хранилище сеансов Flask для временного сохранения списка объектов классов данных. Вот пример класса Transaction и моего TransactionMemoryRepository:

Код: Выделить всё

@dataclass
class Transaction:

transaction_date: datetime.date
amount: decimal.Decimal
concept: str
В репозитории есть методы для сохранения и извлечения транзакций из сеанса:

Код: Выделить всё

from flask import session

class TransactionMemoryRepository:

@staticmethod
def save_transactions(transactions: list[Transaction]):
session['transactions'] = transactions

@staticmethod
def get_transactions() -> list[Transaction]:
tmp_transactions = session.get('transactions', [])
transactions = []

for tmp_transaction in tmp_transactions:
transaction = Transaction(
transaction_date=datetime.strptime(tmp_transaction['transaction_date'], '%a, %d %b %Y %H:%M:%S %Z'),
amount=Decimal(tmp_transaction['amount']),
concept=tmp_transaction['concept'],
category=tmp_transaction.get('category'),
id=tmp_transaction.get('id')
)
transactions.append(transaction)

return transactions

Проблема в том, что при реальном выполнении хранилище сеансов Flask сохраняет список объектов транзакции как список словарей. Вот почему мне нужно сопоставить каждый словарь обратно с объектом транзакции при чтении из сеанса.
Однако во время тестов с использованием test_request_context поведение отличается:
Сеанс сохраняет объекты как фактические экземпляры транзакций
, что приводит к сбою метода чтения с ошибкой:

Код: Выделить всё

TypeError: 'Transaction' object is not subscriptable
Вот моя тестовая настройка с использованием pytest:

Код: Выделить всё

    @pytest.fixture
def flask_app():
app = Flask(__name__)
app.secret_key = "test_secret_key"
return app

@pytest.fixture
def flask_request_context(flask_app):
with flask_app.test_request_context():
yield
Затем я использую этот прибор в своем тесте:

Код: Выделить всё

        def test_save_and_get_transactions(self, flask_request_context):

transactions = [
Transaction(amount=Decimal(100), concept="Concept 1",
transaction_date=datetime.now()),
Transaction(amount=Decimal(200), concept="Concept 2",
transaction_date=datetime.now())
]

TransactionMemoryRepository.save_transactions(transactions)

result = TransactionMemoryRepository.get_transactions()

#asserts ...
Проблема: в рабочей среде сеанс['transactions'] превращается в список словарей, но во время тестов он сохраняет реальные объекты транзакций
сильный>. В результате метод get_transactions() отлично работает в реальном приложении, но не проходит тесты, поскольку я обращаюсь к атрибутам, как если бы они были словарями.
Вопрос:
Почему существует разница между поведением сеанса Flask во время реального выполнения и в тестах с использованием test_request_context?
Как я могу гарантировать, что сеанс ведет себя одинаково в обеих средах, чтобы что мои тесты отражают фактическое поведение?
Временное решение на данный момент — сопоставление с словарем при сохранении, но это обходной путь.
Я прикрепляю два изображения, показывающие результаты отладки. Вы можете видеть, что во время обычного выполнения сеанс возвращает объект Transaction с правильно типизированными атрибутами, а во время тестов он возвращает dict.
Изображение

Изображение


Подробнее здесь: https://stackoverflow.com/questions/793 ... est-contex
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»