zip ファイルへのレコードの追加を処理するループがあります。zipfile オブジェクトをモックしたので、例外を発生させて、大きな zipfile を処理するロジックが正しく機能することを確認したいと考えています。
MagicMocks または単純なモックで最初の呼び出しを受け入れ、2 番目の呼び出しで例外を発生させる方法はありますか?
最も簡単な方法はside_effect
、反復可能、呼び出し可能、または例外 (クラスまたはインスタンス) を受け入れるものを使用することです。
または
side_effect
、例外クラスまたはインスタンスにすることもできます。この場合、モックが呼び出されたときに例外が発生します。
クイックガイドに示されているside_effect
ように、単に例外を発生させるために使用できます
>>> mock = Mock(side_effect=KeyError('foo')) >>> mock() Traceback (most recent call last): ... KeyError: 'foo'
side_effect
さらに、代入では list と Exception を一緒に使用できます。したがって、必要なことを行う最も簡単な方法は次のようなものです。
>>> m = Mock(side_effect=[1, KeyError("bar"), 3])
>>> m("a")
1
>>> m("b")
...
KeyError: 'bar'
>>> m("c")
3
それを行う別の方法は、callable を使用して、モックがどのように反応するかのロジックを記述することです。この場合、引数またはテストの状態に基づいて自由に選択できます。
ジェネレーターと Mock side_effect を使用
from unittest.mock import Mock
def sample_generator():
yield 1
yield 2
raise Exception()
gen = sample_generator()
def sideeffect():
global gen
for x in gen:
return x
m = Mock(side_effect=sideeffect)
m() #1
m() #2
m() #3
得られる:
File "test.py", line 22, in <module>
m() #3
....
raise Exception()
Exception
多少の努力で少しきれいにすることができると確信していますが、それはあなたの基本的な問題を解決するはずです