Объедините возвращаемое значение функции Python с пустым пользовательским вводом

#python #python-3.x #unit-testing #testing #python-unittest

Вопрос:

У меня есть функция внутри fruit.py скрипта, которая возвращает перечисление на основе пользовательского ввода.

 class Selection((IntEnum):  APPLE = 0  ORANGE = 1  PEAR = 2  MELON = 3  GRAPE = 4  def get_input():  selection = int(input("Input an integer from 0 to 4: "))  fruit = Selection(selection)  return fruit  

Теперь я хочу проверить fruit_test.py , не вернет ли он ничего/не вызовет ошибку, если пользовательский ввод пуст:

 import unittest from unittest.mock import patch import fruit  class TestCase(unittest.TestCase):  @patch('builtins.input', return_value=int(''))  def test_empty_input(self, input):  result = fruit.get_input()  self.assertEqual(result, "")  

Но мой тест провалился с ValueError: invalid literal for int() with base 10: '' . Я понимаю, что это потому, что мой ввод патча int('') неверен, но я не знаю, как написать правильный формат тестирования. Кто-нибудь знает, как это решить? Спасибо!

Комментарии:

1. Тест говорит вам правильные вещи — в настоящее время это неверное ожидание, ваша реализация не возвращает пустую строку, если входные данные не могут быть проанализированы как целое число. Таким образом, либо реализация должна измениться, либо тест должен отражать то, что вы ожидаете от нее.


Ответ №1:

вы можете преобразовать свою функцию get_input следующим образом :

 def get_input():  selection = input("Input an integer from 0 to 4: ")  if not selection.isnumeric() or not int(selection) Selection.__members__.values():  return None # or False or "" or whatever you want  fruit = Selection(int(selection))  return fruit  

Комментарии:

1. Можно ли протестировать без изменения get_input() функции? Например, я знаю, что пустой ввод вызовет ошибку TypeError: __call__() missing 1 required positional argument: 'value' , и 8 вызовет ValueError: 8 is not a valid Selection , Есть ли способы проверить эти исключения и ошибки? Этого просто AssertRaises() достаточно?