mock_stdout только перехватывает стандартный вывод оператора print
, поэтому добавьте print(text)
class GameDisplay:
@staticmethod
def prompt(text):
input_value = input(text)
print(text)
return input_value
Этот кусок кода протестирован и работает как ожидалось
@mock.patch('sys.stdout', new_callable=StringIO)
@mock.patch('__builtin__.input', return_value='0')
def test_prompt_output3(self, mock_input, mock_stdout):
p = GameDisplay.prompt('Choose 0: ')
self.assertEqual(p, '0')
self.assertEqual(mock_stdout.getvalue(), 'Choose 0: \n')
но тогда будет напечатано. Выберите 0: дважды
Проверить значение return_value prompt()
должно быть достаточно в реальной жизни.
Остается только 1 опция, если вы действительно хотите смоделировать ввод и вывод одновременно.
Это подойдет, если вы не издеваетесь над print
одновременно:
print(text)
input_value = input()
Или пойти по безумному пути, подделать стандартный вывод:
mock_stdout = StringIO('Choose 0: ')
p = GameDisplay.prompt('Choose 0: ')
self.assertEqual(mock_stdout.getvalue(), 'Choose 0: ')
или это похоже на присвоение return_value для фиктивного объекта:
with mock.patch('sys.stdout', new=StringIO("xxx")) as mock_stdout: