如何测试功能,里面有两个或更多输入()?

时间:2016-09-15 08:39:18

标签: python unit-testing python-3.x python-unittest

我需要测试一些python 3代码,并且我在几乎没有输入()的情况下卡住测试功能。

示例:

def two_answers():
    if input("Input 'go' to proceed") != "go":
        return two_answers()
    else:
        while input("Input 'bananas' to proceed") != "bananas":
            print("What?!")
    print("You've just gone bananas!")

对于具有一个输入的功能,我使用:

def test_some_function(self):
    codefile.input = lambda x: 'u'
    codefile.some_function() . . . .

然后:

def teardown_method(self, method):
    codefile.input = input

要还原输入。

但在这里它不会起作用。救命啊!

4 个答案:

答案 0 :(得分:0)

您想要的是模拟用户输入。

您必须使用unittest.mock并修补input功能。

请参阅Quick Guide

答案 1 :(得分:0)

这是我的解决方案:

def test_some_function(self):
    codefile.input = SimulatedInput("u","v")
    codefile.some_function() . . . .

然后你可以像以前一样使用它:

{{1}}

答案 2 :(得分:0)

我会将输入包装到函数中。

def input_wrap(prompt):
  return input(prompt)

然后你可以注射它。

def two_answers(input_func):
  if input_func('...') != 'go':
    return two_answers(input_func)
  ...

现在,当你想测试它时,你可以注入假冒或模拟:

def test_two_answers(self):
  fake_input = mock.MagicMock()
  fake_input.side_effect = ['go', 'foo', 'bananas']
  two_answers(fake_input) # no assertion for needed since there's no return value

稍后在执行two_answers的代码中,您可以这样调用它:

two_answers(input_wrap)

答案 3 :(得分:-1)

没有依赖关系的简约示例。使用它来扩展它,如你所愿:

import sys
import io

def two_answers():
    if input("Input 'go' to proceed") != "go":
        return two_answers()
    else:
        while input("Input 'bananas' to proceed") != "bananas":
            print("What?!")
    print("You've just gone bananas!")

def wrapper():
    lines = ["go", "bananas"]
    def fake_input(*args, **kwargs):
        return lines.pop(0)
    global input
    real_input = input
    input = fake_input
    two_answers()
    input = real_input


wrapper()