Тестирование функции, использующей пользовательский ввод, в модульных тестах Replit

Я пытаюсь написать тестовый код для функции 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, поскольку описанный выше метод не работает?

Почему play принимает аргумент, если вы его игнорируете?

chepner 17.04.2023 19:33

Есть еще коды для добавления. Я просто добавил ввод, потому что он дает ошибки.

Chanya Subasingha 17.04.2023 22:19
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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, но может ли он выполнять как аргумент, так и пользовательский ввод? это вариант использования, который я хочу. Мы даем рынки для этого упражнения, поэтому я не хочу добавлять здесь весь ответ. Вот почему я удалил неважные коды из функции воспроизведения, где я использовал бы переданный параметр и пользовательский ввод для вычисления возвращаемого значения.

Chanya Subasingha 17.04.2023 22:25

Это работало с patch('builtins.input', side_effect=['0', '5']):'''

Chanya Subasingha 17.04.2023 23:54

Другие вопросы по теме