我正在使用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
仅仅是“输入”的独立于平台的版本(python 2和3)。因此,最终我将尝试模拟用户的输入。我已经尝试过使用列表作为返回值,但这并不能正常工作。
您可以看到,如果返回值无效,那么我将在此处得到一个无限循环。因此,我需要一种最终更改返回值的方法,以便测试实际上完成。
(回答此问题的另一种可能方法是解释如何在单元测试中模仿用户输入)
不是这个问题的重复,主要是因为我没有能力改变输入。
关于这个问题的答案的评论之一是相同的,但是没有提供答案/评论。
在这里也要小心。似乎您正在尝试
—
mgilson 2014年
is
比较字符串文字。不要那样做 它有时起作用的事实只是CPython中的一个实现细节。另外,response is not 'y' or 'n' or 'yes' or 'no'
可能没有按照您的想法做……
response is not 'y' or 'n' or 'yes' or 'no'
在没有做什么,你认为它。请参阅如何针对多个值测试一个变量?你应该不使用is
来比较两个字符串值,使用==
比较值,而不是对象的身份。