[解決済み] 単体テスト用パッチで2つの関数をモック化する
2023-02-20 10:45:05
質問
ユニットテストをしたい関数があるのですが、その関数は他の2つの関数を呼び出します。私はどのようにパッチを使用して適切に同時に両方の関数をモックすることができるかわからない。私は以下に私が意味することの例を提供しました。私がnosetestsを実行するとき、テストは合格しますが、私はこれを行うためのクリーンな方法があるはずだと感じており、私はf.close()に関する部分を本当に理解していません...。
ディレクトリ構造は次のようになります。
program/
program/
data.py
tests/
data_test.py
data.py:
import cPickle
def write_out(file_path, data):
f = open(file_path, 'wb')
cPickle.dump(data, f)
f.close()
data_test.pyです。
from mock import MagicMock, patch
def test_write_out():
path = '~/collection'
mock_open = MagicMock()
mock_pickle = MagicMock()
f_mock = MagicMock()
with patch('__builtin__.open', mock_open):
f = mock_open.return_value
f.method.return_value = path
with patch('cPickle.dump', mock_pickle):
write_out(path, 'data')
mock_open.assert_called_once_with('~/collection', 'wb')
f.close.assert_any_call()
mock_pickle.assert_called_once_with('data', f)
結果
$ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.008s
OK
どのように解決するのですか?
パッチデコレータを使い、このようにネストすることでテストを簡略化することができます(これらは
MagicMock
オブジェクトになります)。
@patch('cPickle.dump')
@patch('__builtin__.open')
def test_write_out(mock_open, mock_pickle):
path = '~/collection'
f = mock_open.return_value
f.method.return_value = path
write_out(path, 'data')
mock_open.assert_called_once_with('~/collection', 'wb')
mock_pickle.assert_called_once_with('data', f)
f.close.assert_any_call()
への呼び出しは
MagicMock
のインスタンスを呼び出すと、新しい
MagicMock
のインスタンスを返すので、他のモックオブジェクトと同じように返された値が呼び出されたことを確認することができます。この場合
f
は
MagicMock
という名前の
'open()'
(試しに
f
).
関連
-
[解決済み] TDDのためのJavaScriptユニットテストツール
-
[解決済み] Gradleを使用して1つのユニットテストクラスのみを実行する方法
-
[解決済み] 抽象クラスをユニットテストする方法:スタブで拡張する?
-
[解決済み] Mockitoで静的メソッドをモックする
-
[解決済み】典型的なテストディレクトリ構造でunittestを実行する
-
[解決済み] DataFrameの文字列、dtypeがobjectの場合
-
[解決済み] dict を txt ファイルに書き、それを読み取る?
-
[解決済み] Python 3でバイナリデータを標準出力に書き込むには?
-
[解決済み] Pythonでファイルの読み込みと上書きをする
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Spyderを仮想環境で動作させるには?
-
[解決済み] 辞書のキーと値を交換するにはどうすればよいですか?
-
[解決済み] 文字列のリストを内容に基づいてフィルタリングする
-
[解決済み] CSVデータを処理する際、1行目のデータを無視する方法を教えてください。
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] if 節の終了方法
-
[解決済み] Pythonでファイルの読み込みと上書きをする
-
[解決済み] データクラスとtyping.NamedTupleの主な使用例
-
[解決済み] 認証プラグイン 'caching_sha2_password' はサポートされていません。
-
[解決済み] Alembicアップグレードスクリプトでインサートやアップデートを実行するにはどうすればよいですか?