2016-09-15 2 views
2

Мне нужно протестировать некоторый код 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 

Чтобы восстановить входы назад.

Но здесь это не сработает. Помогите!

ответ

0

Вот мое решение:

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

Тогда вы могли бы использовать его, как вы делали раньше:

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

Вы хотите, чтобы имитировать пользовательские входы.

Вы должны использовать unittest.mock и исправить функцию input.

См. Quick Guide.

-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() 
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) 
Смежные вопросы