Войдите в raw_input автоматически

Как пример, это может показаться нелогичным. У меня есть функция get_name, как показано ниже, и вы хотите написать автоматический сценарий для вызова этой функции и автоматически ввести в raw_input .

 def get_name (): name = raw_input("Please enter your name : ") print "Hi " + name 

Автоматический сценарий, как показано ниже, какую команду следует добавить для автоматического ввода моего значения?

 def run (): get_name () // what should I add here? 

Вы можете перенаправить свой stdin в файл, а затем raw_input() будет читать из этого файла.

Пример –

 def run(): import sys f1 = sys.stdin f = open('input.txt','r') sys.stdin = f get_name() f.close() sys.stdin = f1 

Обратите внимание: после того, как вы сделаете – f = open('input.txt','r') и sys.stdin = f , raw_input () будет читать из <filename> .

Как только вы закончите с вызовом get_name (), закройте файл и восстановите stdin с помощью sys.stdin = sys.__stdin__ , если вы хотите восстановить его обратно на консольный ввод, иначе вы можете восстановить его на f1 , что бы восстановить его до состояния, которое было до начала теста.

Обратите внимание: вы должны быть осторожны при перенаправлении таких входов.

Для тестирования вы можете вызвать свой сценарий из командной строки с перенаправлением IO – см. Подпроцесс в руководствах, но для быстрого решения вы можете изменить свой код следующим образом: обратите внимание, что это не проверяет raw_input, но позволяет просто протестировать окружающий код :

 def get_name (name=''): """ Code to get the name for testing supply name int the call """ if len(name) == 0: name = raw_input("Please enter your name : ") print "Hi " + name def run (): get_name ("Fred") 

Вы также можете заменить stdin на StringIO (aka memory file) вместо реального файла. Таким образом, введенный текст будет в вашем тестовом коде вместо отдельного текстового файла.

основанный на Anand S Kumar's (+1):

 def run(): import sys import StringIO f1 = sys.stdin f = StringIO.StringIO('entered text') # <-- HERE sys.stdin = f get_name() f.close() sys.stdin = f1 

Кроме того, для более сложного тестирования функций / инструментов интерактивной командной строки вы можете проверить пакет pyexpect .

Другой вариант – сделать функцию ввода параметром, по raw_input :

 def get_name(infunc=raw_input): name = infunc("Please enter your name : ") print "Hi " + name 

Затем для целей тестирования вы можете передать функцию, которая делает все, что вам нужно:

 get_name(lambda prompt: "John Smith")