【问题标题】:Unit testing a method with user input validations使用用户输入验证对方法进行单元测试
【发布时间】:2019-05-10 07:32:50
【问题描述】:

我有一种方法可以接受用户输入并对其进行验证,直到他们输入正确的值。我不确定如何为此方法编写单元测试,因为它已经验证了用户输入。

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

【问题讨论】:

    标签: python python-2.7 unit-testing tdd


    【解决方案1】:

    您可以使用mockmock a raw_input in Python,也可以使用capture standard output by redirecting sys.stdout to a 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()
    

    【讨论】:

      猜你喜欢
      • 2017-06-13
      • 2019-01-12
      • 2018-10-23
      • 2012-06-01
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      相关资源
      最近更新 更多