[英]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
参数。 无论如何都要留下这里的修改版本,以防有人想做点什么。 要使用其他函数,请使用patch
的new_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.