Я пытаюсь написать тестовый код для функции Python в Replit. Функция принимает пользовательский ввод с консоли. Как написано в тесте нужно передать значение в функцию. Тестовый код:
self.assertTrue(play(10) <6)
В функции пользовательский ввод должен выполняться, как показано ниже (в функции есть больше кодов, которые используют num и n для определения возвращаемого значения:
def play(n):
num = int(input("Enter the ammount"))
return num
Я получаю сообщение об ошибке: RuntimeError: input(): потерян sys.stdin
Есть ли способ протестировать функции с пользовательским вводом в модульном тесте Replit, поскольку описанный выше метод не работает?
Есть еще коды для добавления. Я просто добавил ввод, потому что он дает ошибки.
def play(n):
num = int(input("Enter the ammount"))
return num
Что касается вышеуказанной функции, вам нужно изменить ее, например,
def play(n):
return n/2
Таким образом он становится чистым (даже чистым). Таким образом, вы можете легко проверить это, как
self.assertTrue(play(10) < 6)
Затем, если вы хотите передать пользовательский ввод, просто
num = int(input("Enter the ammount"))
play(num)
Вы можете использовать unittest.mock.patch для исправления практически всего, что есть на свете, включая встроенные функции.
from unittest.mock import patch
with patch('builtins.input', side_effect=['0', '5']):
self.assertTrue(play(10) < 6)
Как указано в комментариях, ваша функция play
должна либо принимать аргумент (и не вызывать input
), либо не должна принимать аргумент. Прямо сейчас вы берете n
, но никогда не используете его.
Спасибо! Я попробую unittest.mock.patch, но может ли он выполнять как аргумент, так и пользовательский ввод? это вариант использования, который я хочу. Мы даем рынки для этого упражнения, поэтому я не хочу добавлять здесь весь ответ. Вот почему я удалил неважные коды из функции воспроизведения, где я использовал бы переданный параметр и пользовательский ввод для вычисления возвращаемого значения.
Это работало с patch('builtins.input', side_effect=['0', '5']):'''
Почему
play
принимает аргумент, если вы его игнорируете?