Python 3 unittest模拟用户输入

roy*_*ter 4 unit-testing python-3.x

如何在单元测试调用的函数中模拟用户输入(使用Python 3的unittest)?例如,我有一个函数foo()谁正在测试我的输出.在该foo()函数中,它要求用户输入:

x = input(msg)

输出基于输入:

print("input: {0}".format(x))

我希望我的单元测试运行foo(),输入一个输入并将结果与​​预期结果进行比较.

Nic*_*tin 8

当我正在尝试测试为用户输入提供对话框的代码时,我经常遇到这个问题,同样的解决方案应该适用于两者.您需要提供一个绑定到input测试作用域中名称的新函数,其具有与标准input函数相同的签名,该函数仅返回测试值而不实际提示用户.根据您的测试和代码的设置方式,这种注入可以通过多种方式完成,因此我将其留作读者的练习,但您的替换方法将是简单的:

def my_test_input(message):
  return 7
Run Code Online (Sandbox Code Playgroud)

显然你也可以打开message相关内容,并返回你选择的数据类型.您还可以执行更灵活,更通用的操作,以便在许多情况下重用相同的替换方法:

def my_test_input(retval, message):
  return retval
Run Code Online (Sandbox Code Playgroud)

然后你会将一个部分函数注入input:

import functools
test_input_a = functools.partial(my_test_input, retval=7)
test_input_b = functools.partial(my_test_input, retval="Foo")
Run Code Online (Sandbox Code Playgroud)

离开test_input_atest_input_b作为单个message参数的函数,retval参数已经绑定.