У меня есть модульное тестирование, которое работает как задумано, однако я чувствую, что это не лучший способ протестировать несколько входов с помощью pytest. Это определенно нарушает принцип СУХОГО. Я думаю, что есть лучший способ сделать это, но я не могу понять, что. Я также не уверен, что на самом деле делать с макетом. Он не используется, но он должен быть там (см. Параметр «mock_choice» в функции в коде ниже).
Я подумал, что, возможно, циклический вызов будет работать, но это не сработало так, как задумано. Я действительно не мог найти другой способ, кроме использования side_effects и четырехкратного вызова, чтобы убедиться, что я получаю возвращаемое значение, как и предполагал.
Функция для проверки
def export_options():
while True:
try:
choice = int(input("\nPlease make a selection"))
if choice in ([option for option in range(1, 5)]):
return choice # This what I'm testing
else:
print("\nNot a valid selection\n")
except ValueError as err:
print("Please enter an integer")
Функция тестирования
@mock.patch('realestate.app.user_inputs.input', side_effect=[1, 2, 3, 4])
def test_export_options_valid_choice(mock_choice): # mock_choice needs to be here but isn't used!
export_option = user_inputs.export_options()
assert export_option == 1
export_option = user_inputs.export_options()
assert export_option == 2
export_option = user_inputs.export_options()
assert export_option == 3
export_option = user_inputs.export_options()
assert export_option == 4
Тест работает. Он проходит, когда функция возвращает все значения от 1 до 4. Однако, поскольку код очень повторяется, я хотел бы знать, есть ли лучший способ проверить несколько входных вызовов, как я хотел бы применить то же самое для будущих тестов.