仅作为一个例子,它可能看起来不合逻辑。我有一个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?
答案 0 :(得分:6)
您可以将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()调用后,关闭文件并使用sys.stdin = sys.__stdin__
恢复标准输入,如果要将其恢复为控制台输入,则可以将其恢复为f1
,它将恢复到测试开始前的状态。
请注意,重定向此类输入时应小心。
答案 1 :(得分:5)
您也可以将stdin
替换为StringIO(也就是内存文件)而不是真实文件。这样输入的文本将在您的测试代码中,而不是单独的文本文件。
基于Anand S Kumar(+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包。
答案 2 :(得分:2)
对于测试,您可以通过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")
答案 3 :(得分:2)
另一种选择是将输入函数作为参数,默认到raw_input
:
def get_name(infunc=raw_input):
name = infunc("Please enter your name : ")
print "Hi " + name
然后出于测试目的,您可以传递一个可以满足您需要的功能:
get_name(lambda prompt: "John Smith")