2016-09-15 8 views
2

私はいくつかのPython 3のコードをテストする必要があり、私はいくつかのinput()のテスト機能がスタックされています。2つ以上のinput()が内部にある関数をテストするには?

例:入力を戻すために

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

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

そして:iが使用つの入力を持つ関数について

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!") 

しかし、ここでは動作しません。助けて!

答えて

0

は私のソリューションです:

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

ユーザー入力をシミュレートすることです。

unittest.mockを使用し、input機能にパッチを適用する必要があります。

Quick Guideを参照してください。ここで

-1

依存性のないミニマルな例:あなたが前に行ったよう

class SimulatedInput: 

    def __init__(self,*args): 
     self.args = iter(args) 

    def __call__(self,x): 
     try: 
      return next(self.args) 
     except StopIteration: 
      raise Exception("No more input") 

次に、あなたがそれを使用することができます。

0

入力を関数にラップします。

def input_wrap(prompt): 
    return input(prompt) 

次に注入できます。

two_answers(input_wrap) 
:後で、このようにそれを呼び出すtwo_answersを実行するコードで

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 

:今、あなたは偽物やモックを注入することができ、それをテストしたいとき

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

関連する問題