我正在使用pythons mock.patch,并且想要更改每个调用的返回值。需要注意的是:要修补的函数没有输入,因此不能根据输入更改返回值。
下面是我的代码以供参考。
def get_boolean_response():
response = io.prompt('y/n').lower()
while response not in ('y', 'n', 'yes', 'no'):
io.echo('Not a valid input. Try again'])
response = io.prompt('y/n').lower()
return response in ('y', 'yes')
我的测试代码:
@mock.patch('io')
def test_get_boolean_response(self, mock_io):
#setup
mock_io.prompt.return_value = ['x','y']
result = operations.get_boolean_response()
#test
self.assertTrue(result)
self.assertEqual(mock_io.prompt.call_count, 2)
io.prompt
只是一个独立于平台(Python2和3)的"input“版本。因此,最终我会尝试模拟用户的输入。我尝试过使用列表作为返回值,但这不能正常工作。
你可以看到,如果返回值是无效的,我将在这里得到一个无限循环。所以我需要一种方法来最终改变返回值,这样我的测试才能真正结束。
(回答这个问题的另一种可能方法是解释如何在单元测试中模拟用户输入)
不是this question的dup,主要是因为我没有能力改变输入。
this question上的一个答案的评论也是这样的,但没有提供答案/评论。
发布于 2021-03-29 17:58:51
您也可以对多个返回值使用patch:
@patch('Function_to_be_patched', return_value=['a', 'b', 'c'])
请记住,如果您正在为一个方法使用多个补丁,则其顺序将如下所示:
@patch('a')
@patch('b')
def test(mock_b, mock_a);
pass
正如你在这里看到的,它将被恢复。首先提到的补丁将放在最后一个位置。
https://stackoverflow.com/questions/24897145
复制相似问题