Отделите источник команд от их обработки: функция должна принимать iterable, а тест передавать генератор с корректными, ошибочными командами и завершением.
Переделайте цикл обработки команд так, чтобы для тестирования он читал команды из генератора, включая корректные и некорректные случаи, а не через `input()`.
Отделите источник команд от их обработки: функция должна принимать iterable, а тест передавать генератор с корректными, ошибочными командами и завершением.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Отделите источник команд от их обработки: функция должна принимать iterable, а тест передавать генератор с корректными, ошибочными командами и завершением.
Исходный цикл не приведён, поэтому ниже шаблон для условных команд ping и exit, а не замена неизвестной бизнес-логики:
def process(commands):
for raw in commands:
command = raw.strip()
if command == 'exit':
break
yield 'pong' if command == 'ping' else 'invalid'
def test_commands():
yield 'ping'
yield 'unknown'
yield ''
yield 'exit'
yield 'ping' # уже не обрабатывается
assert list(process(test_commands())) == ['pong', 'invalid', 'invalid']
Для реального приложения обработчик команд оставляют прежним, меняют только зависимость от input. Отдельно проверяют исчерпание генератора, пробелы и ошибки формата.