首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python模拟多个返回值

Python模拟多个返回值
EN

Stack Overflow用户
提问于 2014-07-23 04:25:18
回答 1查看 163.1K关注 0票数 248

我正在使用pythons mock.patch,并且想要更改每个调用的返回值。需要注意的是:要修补的函数没有输入,因此不能根据输入更改返回值。

下面是我的代码以供参考。

代码语言:javascript
复制
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')

我的测试代码:

代码语言:javascript
复制
@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上的一个答案的评论也是这样的,但没有提供答案/评论。

EN

回答 1

Stack Overflow用户

发布于 2021-03-29 17:58:51

您也可以对多个返回值使用patch:

代码语言:javascript
复制
@patch('Function_to_be_patched', return_value=['a', 'b', 'c'])

请记住,如果您正在为一个方法使用多个补丁,则其顺序将如下所示:

代码语言:javascript
复制
@patch('a')
@patch('b')
def test(mock_b, mock_a);
    pass

正如你在这里看到的,它将被恢复。首先提到的补丁将放在最后一个位置。

票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24897145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档