Я предполагаю, что вы хотите написать тест для login_features()
. Как правило, я бы реорганизовал функцию следующим образом:
def execute_login_option(opt_str: str):
switcher = {...}
login = switcher.get(login_input, login_features)
login() # Executing the called function
def login_features():
print("Choose option to login")
print("1. BDO login")
print("2. GPM login")
print("3. Member login")
login_input = int(input())
execute_login_option(login_input)
Таким образом, у вас есть простой способ просто протестировать execute_login_option
без необходимости исправления input()
.
Если вам нужно Для получения некоторого ввода вы можете использовать Python s unittest.mock.patch
:
def my_function_with_input():
test = input("please enter a value")
return test
with mock.patch('%s.input' % __name__) as patched_input:
patched_input.return_value = "foo"
assert my_function_with_input() == "foo"
В этом контексте я переопределяю возвращаемое значение вызовов для input()
, чтобы оно было "foo"
. Аналогично, вы можете установить возвращаемое значение для желаемого пользовательского ввода в ваших тестовых случаях для login_features
.
Редактировать (чтобы ответить на вопрос в комментарии о том, как тестировать функции, которые не возвращают значения) :
Если ваша функция не возвращает значение для утверждения, она обычно меняет состояние всей системы как побочный эффект (в вашем примере один такой побочный эффект мог бы будь что пользователь залогинен). Ниже приведен минимальный пример того, как тестировать в такой настройке:
from unittest import mock
class ClassToTest:
def __init__(self):
self.state = "A"
def my_function_with_input(self):
test = input("please enter a value")
if test == "foo":
self.state = "B"
else:
self.state = "C"
def my_function_with_input():
test = input("please enter a value")
return test
with mock.patch('%s.input' % __name__) as patched_input:
patched_input.return_value = "foo"
test_obj = ClassToTest()
assert test_obj.state == "A"
test_obj.my_function_with_input()
assert test_obj.state == "B" # assert that the state changed to B
Существует больше опций и возможностей, которые можно использовать, используя unittest.mock -рамку.