Назад к вопросам
Senior
2
class ATM(SKD): def __init__(self, atm_api: "SKD"): self.atm_api: SKD = atm_api self.bills_count: dict[int:int] = {bill: self.atm_api.count_banknotes(bill) for bill in BILLS} def withdraw(self, amount: int) -> bool: bills_plan: dict[int: int] = {} remaining = amount for bill in BILLS: available = self.bills_count[bill] take = min(remaining // bill, available) if take > 0: bills_plan[bill] = take remaining -= take * bill if remaining != 0: return False bills_count_const = {50: 0, 100: 2, 500: 0, 1000: 0, ...}, expected = True @pytest.mark.parametrize( "bills_count_const,expected", [ ({5000: 0, 1000: 0, 500: 0, 100: 0, 50: 0}, False), ({5000: 100, 1000: 100, 500: 100, 100: 100, 50: 100}, True), ({5000: 1, 1000: 0, 500: 0, 100: 2, 50: 0}, True) ] ) def test_false(bills_count_const, expected): atm = ATM(FakeSDK()) atm.bills_count = bills_count_const amount = 1000 res = atm.withdraw(amount) assert res == expected
Компании, где спрашивали
Яндекс
Ответ от нейросети
sobes.tech AI
В представленном коде класс ATM реализует логику снятия наличных с банкомата, используя доступные купюры. Метод withdraw пытается составить план выдачи суммы amount, начиная с самых крупных купюр, уменьшая остаток на сумму выданных купюр.
Тесты с помощью pytest проверяют корректность работы метода withdraw при разных состояниях наличия купюр (bills_count_const) и ожидаемом результате (True/False).
Ключевые моменты:
- Метод withdraw возвращает False, если невозможно выдать точную сумму из имеющихся купюр.
- Тесты параметризованы, что позволяет проверить разные сценарии без дублирования кода.
Пример использования параметризации в pytest:
import pytest
@pytest.mark.parametrize(
"bills_count_const,expected",
[
({5000: 0, 1000: 0, 500: 0, 100: 0, 50: 0}, False),
({5000: 100, 1000: 100, 500: 100, 100: 100, 50: 100}, True),
({5000: 1, 1000: 0, 500: 0, 100: 2, 50: 0}, True)
]
)
def test_withdraw(bills_count_const, expected):
atm = ATM(FakeSDK())
atm.bills_count = bills_count_const
amount = 1000
assert atm.withdraw(amount) == expected
Такой подход позволяет легко расширять тесты и поддерживать качество кода.