Задача курса
Python: Напиши тесты для PricingService с stub-репозиторием
Курс «Python для продвинутых: ООП, типизация и тестирование» · урок «Тестируемый дизайн: явная зависимость и простой stub»
Условие
Напиши тесты для PricingService с stub-репозиторием
Тебе нужно написать pytest-тесты для класса PricingService, который принимает репозиторий товаров через __init__ и формирует итоговую цену заказа.
Что уже дано
Проверяющая система скрыто определяет следующие классы в том же пространстве имён до запуска твоего кода:
class PricingService:
def __init__(self, repo) -> None:
self.repo = repo
def total(self, sku_quantities: dict[str, int]) -> float:
"""Возвращает сумму price * quantity по каждому SKU."""
result = 0.0
for sku, qty in sku_quantities.items():
price = self.repo.get_price(sku)
result += price * qty
return result
def most_expensive(self, skus: list[str]) -> str:
"""Возвращает SKU с наибольшей ценой из переданного списка."""
return max(skus, key=lambda s: self.repo.get_price(s))
PricingService уже доступен по имени — импортировать ничего не нужно.
Твой код выполняется в одном процессе с классом PricingService. stdin не используется. Печатать через print в stdout ничего не нужно.
Что нужно сделать
Напиши в редакторе pytest-тесты, используя stub-репозиторий вместо реального хранилища. Тебе нужно:
Определить класс
FakeRepoс методомget_price(self, sku: str) -> float, который возвращает фиксированные цены по SKU из словаря, переданного в__init__.Написать тест
test_total_single_item— проверяет, чтоtotalдля одного товара возвращаетprice * quantity.Написать тест
test_total_multiple_items— проверяет, чтоtotalдля нескольких товаров возвращает правильную сумму.Написать тест
test_most_expensive_returns_correct_sku— проверяет, чтоmost_expensiveвозвращает SKU с наибольшей ценой из списка.
Все тесты должны использовать FakeRepo, а не реальное хранилище.
Ввод и вывод
stdin не используется. Печатать через print в stdout ничего не нужно.
Проверяющая система запускает твои тест-функции напрямую как обычные функции Python. Она также подменяет PricingService сломанными реализациями (мутантами) и ожидает, что соответствующий тест поднимет AssertionError.
