unit-testing - Python 3 unittest 模拟用户输入

标签 unit-testing python-3.x

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

x = input(msg)



输出基于输入:

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



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

最佳答案

当我尝试测试为用户输入带来对话框的代码时,我经常遇到这个问题,并且相同的解决方案应该适用于两者。您需要提供一个绑定(bind)到名称 input 的新函数在您的测试范围内,具有与标准 input 相同的签名只返回一个测试值而不实际提示用户的函数。根据您的测试和代码的设置方式,可以通过多种方式完成此注入(inject),因此我将把它作为练习留给读者,但您的替换方法将很简单,例如:

def my_test_input(message):
  return 7

显然你也可以打开message的内容。如果那是相关的,当然返回您选择的数据类型。您还可以做一些更灵活和通用的事情,允许在多种情况下重用相同的替换方法:
def my_test_input(retval, message):
  return retval

然后将部分函数注入(inject) input :
import functools
test_input_a = functools.partial(my_test_input, retval=7)
test_input_b = functools.partial(my_test_input, retval="Foo")

离开test_input_atest_input_b作为采用单个 message 的函数参数,使用 retval参数已经绑定(bind)。

关于unit-testing - Python 3 unittest 模拟用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1329172/

相关文章:

python - 对所有值列求和并根据组在 df 中添加总行

python - 使用应用程序工厂时在 pytest 测试中访问 Flask 测试客户端 session

javascript - 我们可以使用 Jasmine 在测试中执行异步操作吗?

unit-testing - 测试 AngularJS 范围变量

c - 在 Windows 上使用哪个单元测试框架进行 C 开发?

javascript - 如何在 javascript 中为 azure 持久函数编排实现基本单元测试

python - 如何使用 scapy 模块发送请求并接受三个答案?

python-3.x - Pandas - 使用 to_hdf 添加同名数据框使文件大小翻倍

python-3.x - 如何计算连续超过 1 个字符的大写单词的数量

python - python中打印函数的错误?