Код: Выделить всё
@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
Однако во время тестов с использованием test_request_context поведение отличается:
Сеанс сохраняет объекты как фактические экземпляры транзакций, что приводит к сбою метода чтения с ошибкой:
Код: Выделить всё
TypeError: 'Transaction' object is not subscriptable
Код: Выделить всё
@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 ...
сильный>. В результате метод get_transactions() отлично работает в реальном приложении, но не проходит тесты, поскольку я обращаюсь к атрибутам, как если бы они были словарями.
Вопрос:
Почему существует разница между поведением сеанса Flask во время реального выполнения и в тестах с использованием test_request_context?
Как я могу гарантировать, что сеанс ведет себя одинаково в обеих средах, чтобы что мои тесты отражают фактическое поведение?
Временное решение на данный момент — сопоставление с словарем при сохранении, но это обходной путь.
Я прикрепляю два изображения, показывающие результаты отладки. Вы можете видеть, что во время обычного выполнения сеанс возвращает объект Transaction с правильно типизированными атрибутами, а во время тестов он возвращает dict.


Подробнее здесь: https://stackoverflow.com/questions/793 ... est-contex