7

zip ファイルへのレコードの追加を処理するループがあります。zipfile オブジェクトをモックしたので、例外を発生させて、大きな zipfile を処理するロジックが正しく機能することを確認したいと考えています。

MagicMocks または単純なモックで最初の呼び出しを受け入れ、2 番目の呼び出しで例外を発生させる方法はありますか?

4

2 に答える 2

26

最も簡単な方法は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 を使用して、モックがどのように反応するかのロジックを記述することです。この場合、引数またはテストの状態に基づいて自由に選択できます。

于 2015-04-16T06:50:09.883 に答える
3

ジェネレーターと 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

多少の努力で少しきれいにすることができると確信していますが、それはあなたの基本的な問題を解決するはずです

于 2015-04-15T15:54:02.817 に答える