#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()
достаточно?