Модульное тестирование метода с проверками пользовательского ввода - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть метод, который принимает пользовательские данные и проверяет их, пока они не введут правильное значение.Я не уверен, как написать модульный тест для этого метода, так как он уже проверяет пользовательский ввод.

def refreshtime_validation():
    while True:
        try:
            runtime_input = float(raw_input("Enter Refresh Time (in seconds): "))
        except ValueError:
            print "\n**Please enter a valid number (Must be an integer).**\n"
            continue
        if runtime_input <= 0:
            print "\n**Please enter a valid number (Must be greater than 0).**\n"
            continue
        else:
            return runtime_input

Как мне написать модульный тест для этого метода?Единственное, что у меня есть, это

self.assertEquals('1','1')    
self.assertEquals('100','100')
self.assertEquals('100000','100000')

1 Ответ

0 голосов
/ 09 декабря 2018

Вы можете использовать mock to mock raw_input в Python , и вы можете захватить стандартный вывод, перенаправив sys.stdout в StringIO.Таким образом, вы можете смоделировать ввод вашей функции и проверить как недействительные, так и допустимые случаи:

import sys
import mock
import unittest
import StringIO
import __builtin__


# [..] your code


class Test(unittest.TestCase):
    @mock.patch.object(__builtin__, 'raw_input')
    def test_refreshtime_validation(self, mocked_raw_input):
        my_stdout = StringIO.StringIO()
        sys.stdout = my_stdout
        mocked_raw_input.side_effect = ['error', '0', '1']
        outputs = '\n**Please enter a valid number (Must be an integer).**\n'+\
            '\n\n**Please enter a valid number (Must be greater than 0).**\n\n'
        valid_value = refreshtime_validation()
        sys.stdout = sys.__stdout__
        self.assertEquals(my_stdout.getvalue(), outputs)
        self.assertEquals(valid_value, 1)


unittest.main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...