[解決済み】Pythonモックの複数の戻り値
2022-04-19 19:25:15
質問
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) に過ぎません。つまり、最終的に私はユーザーの入力をモック化しようとしているのです。戻り値にリストを使おうとしましたが、うまくいきません。
もし戻り値が無効なものであれば、ここで無限ループに陥ることがおわかりいただけると思います。ですから、最終的に戻り値を変更して、テストが実際に終了するようにする方法が必要です。
(この質問に答える別の方法として、ユニットテストでユーザー入力を模倣する方法を説明することができます)
のダブりではありません。 この質問 主に、入力を変化させる機能がないためです。
のAnswerのコメントの1つに この質問 も同じような内容ですが、回答・コメントはありません。
解決方法を教えてください。
を割り当てることができます。
イテラブル
から
side_effect
そして、モックは呼び出されるたびにその次の値を返します。
>>> from unittest.mock import Mock
>>> m = Mock()
>>> m.side_effect = ['foo', 'bar', 'baz']
>>> m()
'foo'
>>> m()
'bar'
>>> m()
'baz'
を引用しています。
Mock()
ドキュメンテーション
:
もし サイドエフェクト が反復可能である場合、モックを呼び出すたびに反復可能な値の次の値が返されます。
関連
-
[解決済み】Python elifの構文が無効です【終了しました
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] 複数の例外を1行でキャッチする(ブロックを除く)
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] 環境変数の値にアクセスする方法
-
[解決済み] Mockitoでvoidメソッドをモックする方法
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonの非常に便利な2つのデコレーターを解説
-
PicgoのイメージベッドツールをPythonで実装する
-
Pythonによるjieba分割ライブラリ
-
PythonによるExcelファイルの一括操作の説明
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み】ImportError: PILという名前のモジュールがない
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く
-
[解決済み】ImportError: bs4という名前のモジュールがない(BeautifulSoup)