当前位置: 首页 > 面试题库 >

Python模拟多个返回值

韦绍晖
2023-03-14
问题内容

我正在使用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只是“ input”的独立于平台的版本(python
2和3)。因此,最终我将尝试模拟用户的输入。我已经尝试过使用列表作为返回值,但这并不能正常工作。

您可以看到,如果返回值无效,那么我将在此处得到一个无限循环。因此,我需要一种最终更改返回值的方法,以便测试实际上完成。

(回答这个问题的另一种可能的方式可能是解释如何在单元测试中模仿用户输入)


问题答案:

你可以指定一个 迭代
side_effect,并模拟将序列中的每个被调用时,返回的下一个值:

>>> from unittest.mock import Mock
>>> m = Mock()
>>> m.side_effect = ['foo', 'bar', 'baz']
>>> m()
'foo'
>>> m()
'bar'
>>> m()
'baz'

引用Mock()文档:

如果 side_effect 是可迭代的,则每次对模拟的调用都将返回可迭代的下一个值。



 类似资料:
  • 问题内容: 使用模拟进行单元测试conn(): app.py test.py 错误:未调用 断言 。 我认为这是因为’Database_url’不在我打补丁的os.environ中,并且因为没有对mysql_mock.connect进行该测试调用。 问题: 1为了使此测试代码有效,我需要进行哪些更改? 2.我还必须修补’urlparse’吗? 问题答案: 您可以尝试此解决方案。只需调用一个参数即可

  • 调试时,在带有的行中弹出一个NullPointerException,类为。

  • 我试图测试一个简单POST Rest调用,但存在NullPointerException。 我的RestController: 我的单元测试: 由于以下错误,此测试失败:NullPointerException,确切地说,response ResponseEntity对象为Null。 verify输出将执行以下操作: 知道为什么响应是空的吗?我为测试使用了正确的注释,因此应该注入模拟。也许我在这里

  • 我正在处理一个Spring Boot java服务,该服务包含一个Camel处理器类,如下所示: 当我运行它时,我得到一个失败,声明对1*LogService.Update(_)的调用太少(0个调用)。我试着调试代码,在MyProc中,语句被命中,并且logService对象在高亮显示时(在Eclipse中)状态为“mock for type logService named$spock_shar

  • 我有下面的课,我试图测试。我遇到问题的方法是,因为我试图存根/模拟行为,然后在测试中验证行为。

  • 我正在使用wireMock,即使存根响应是200 OK,我也得到了500内部服务器错误的一致响应。 如果我调试,我看到连接总是关闭的。知道可能会出什么问题吗?或者我做错了什么。 这是测试 试图嘲笑:http://localhost:8080/path/endPoint?id1={标识1} 上面的调用是在MyController中自动安装的客户端类中进行的。因为它不是直接调用,所以有可能被嘲笑吗?