私は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つは同じ行に沿っていますが、回答/コメントは提供されていません。
is
文字列リテラルの比較に使用しようとしているようです。しないでください。(時々)動作するという事実は、CPythonの実装の詳細にすぎません。また、response is not 'y' or 'n' or 'yes' or 'no'
おそらくあなたが思っていることを実行していない...
response is not 'y' or 'n' or 'yes' or 'no'
ではないあなたはそれがない何を考えてやって。1つの変数を複数の値に対してテストするにはどうすればよいですか?を参照してください。また、文字列値の比較には使用is
しないでください。オブジェクトIDではなく、値の==
比較に使用してください。