繁体   English   中英

Python使用模拟库测试循环中的用户输入

[英]Python testing using mock library for user input in a loop

我试图使用模拟库来测试一段代码。 在此代码中,用户原始输入在for循环中被接受,如下所示。 我编写了测试用例test_apple_record ,它可以为托盘编号提供单个用户输入值。

但是,对于for循环中的每次迭代,它只需要与预期相同的值(5)。

问题是:如何为每次迭代提供不同的值? 例如,对于i = 0,1和2的托盘编号,具体值分别为5,6和7。

class SomeClass(unittest.TestCase):    
    def apple_counter(self):
        apple_record = {}
        for i in range(3):
            apple_tray = input("enter tray number:")
            apple_record[apple_tray]  =  (i+1)*10
            print("i=%d, apple_record=%s"%(i, apple_record))

    def test_apple_record(self):
        with mock.patch('builtins.input', return_value='5'):
            self.apple_counter()

您可以将side_effect参数与iterable一起使用以提供返回值:

with mock.patch('builtins.input', side_effect=[5, 6, 7]):
    self.apple_counter()

查看文档

如果side_effect是一个可迭代的,那么对mock的每次调用都将返回iterable中的下一个值。

事实证明我正在重新发明轮子。 请改用side_effect参数。 无论如何都要留下这里的修改版本,以防有人想做点什么。

要使用其他函数,请使用patchnew_callable关键字参数

with mock.patch('builtins.input', new_callable=lambda *x: random.randrange(0,10)):
    do_stuff()

然而,这意味着值完全是随机的,这对于测试来说是不可取的,因为这意味着测试不是确定性的,并且可能失败或完全不是偶然的。 另外,您可能希望input()函数发出生成的非随机值,例如一系列命令或类似命令。 为此,我认为最简单的方法是生成器功能。

def input_generator(): # generate squares as an example
    a = 0
    while True:
        yield a**2
        a += 1

g = input_generator()

with mock.patch('builtins.input', lambda *x: next(g)):
    do_stuff()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM