Задача курса

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-репозиторий вместо реального хранилища. Тебе нужно:

  1. Определить класс FakeRepo с методом get_price(self, sku: str) -> float, который возвращает фиксированные цены по SKU из словаря, переданного в __init__.

  2. Написать тест test_total_single_item — проверяет, что total для одного товара возвращает price * quantity.

  3. Написать тест test_total_multiple_items — проверяет, что total для нескольких товаров возвращает правильную сумму.

  4. Написать тест test_most_expensive_returns_correct_sku — проверяет, что most_expensive возвращает SKU с наибольшей ценой из списка.

Все тесты должны использовать FakeRepo, а не реальное хранилище.

Ввод и вывод

stdin не используется. Печатать через print в stdout ничего не нужно.

Проверяющая система запускает твои тест-функции напрямую как обычные функции Python. Она также подменяет PricingService сломанными реализациями (мутантами) и ожидает, что соответствующий тест поднимет AssertionError.

Попробуйте решить

РешениеPython
Без регистрации · результат не сохраняется