私は 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) 「入力」のバージョンです。したがって、最終的には、ユーザーの入力を模擬しようとしています。戻り値にリストを使用しようとしましたが、うまくいかないようです。
戻り値が無効な値である場合、ここで無限ループが発生することがわかります。したがって、テストが実際に終了するように、最終的に戻り値を変更する方法が必要です。
(この質問に答える別の方法としては、ユニットテストでユーザー入力を模倣する方法を説明することです)
重複ではありませんこの質問主な理由は、入力を変更する能力がないからです。
回答のコメントの1つこの質問同様の内容ですが、回答/コメントは提供されていません。
ベストアンサー1
割り当てることができます反復可能にするside_effect
と、モックは呼び出されるたびにシーケンス内の次の値を返します。
>>> from unittest.mock import Mock
>>> m = Mock()
>>> m.side_effect = ['foo', 'bar', 'baz']
>>> m()
'foo'
>>> m()
'bar'
>>> m()
'baz'
引用:Mock()
ドキュメンテーション:
side_effectが反復可能オブジェクトである場合、モックの各呼び出しは反復可能オブジェクトから次の値を返します。