如何在Python中模拟用户输入

时间:2017-09-14 15:09:28

标签: python unit-testing mocking tdd python-mock

我目前正在尝试学习如何使用Python进行单元测试,并介绍了Mocking的概念,我是一名初学Python开发人员,希望学习TDD的概念以及我的Python技能开发。我正在努力学习用Python unittest.mock documentation.的用户给定输入来模拟类的概念。如果我能得到一个如何模拟某个函数的例子,我将非常感激。我将使用此处的示例:Example Question

class AgeCalculator(self):

    def calculate_age(self):
        age = input("What is your age?")
        age = int(age)
        print("Your age is:", age)
        return age

    def calculate_year(self, age)
        current_year = time.strftime("%Y")
        current_year = int(current_year)
        calculated_date = (current_year - age) + 100
        print("You will be 100 in", calculated_date)
        return calculated_date

请有人可以使用Mocking创建我的示例单元测试,以自动化年龄输入,以便返回模拟年龄为100的年份。

谢谢。

3 个答案:

答案 0 :(得分:1)

您可以在Python3.x中模拟buildins.input方法,并使用with语句来控制模拟时段的范围。

import unittest.mock
def test_input_mocking():
    with unittest.mock.patch('builtins.input', return_value=100):
         xxx

答案 1 :(得分:0)

在这里 - 我修复了calculate_age(),你试试`calculate_year。

    class AgeCalculator:  #No arg needed to write this simple class

        def calculate_age():  # Check your sample code, no 'self' arg needed
            #age = input("What is your age?") #Can't use for testing
            print ('What is your age?') #Can use for testing 
            age = '9' # Here is where I put in a test age, substitutes for User Imput
            age = int(age)
            print("Your age is:", age)
            #return age -- Also this is not needed for this simple function

        def calculate_year(age): # Again, no 'Self' arg needed - I cleaned up your top function, you try to fix this one using my example
            current_year = time.strftime("%Y")
            current_year = int(current_year)
            calculated_date = (current_year - age) + 100
            print("You will be 100 in", calculated_date)
            return calculated_date


    AgeCalculator.calculate_age()

从我在你的代码中看到的,你应该查看如何构建函数 - 并且请不要以冒犯性的方式接受它。您也可以通过运行来手动测试您的功能。正如你的代码所代表的那样,它不会运行。

祝你好运!

答案 2 :(得分:-1)

你不是模拟输入,而是功能。在这里,模仿input基本上是最容易做的事情。

from unittest.mock import patch

@patch('yourmodule.input')
def test(mock_input):
    mock_input.return_value = 100
    # Your test goes here