20

クラス (@property デコレータ) のプロパティをモックしようとしていますが、この不適切な動作に遭遇しました:

 >>> from mock import MagicMock, PropertyMock
 >>> m = MagicMock()
 >>> type(m).p = PropertyMock(side_effect=AttributeError)
 >>> m.p
 <MagicMock name='mock.p' id='63150736'>

正しい動作は次のとおりです。

 >>> from mock import MagicMock, PropertyMock
 >>> m = MagicMock()
 >>> type(m).p = PropertyMock(side_effect=ValueError)
 >>> m.p
Traceback (most recent call last)
[...]
ValueError

別の例外を設定すると、なぜ別の結果が得られるのか理解できません。どちらの場合も、期待される結果は、例外が発生することです! したがって、In[4] 行はAttributeError. そうではありません。

誰か教えてくれませんか?

補遺: 私がチェックしようとしているプロパティは、渡された値が正常かどうかを確認するための巧妙なチェックを行います。上記の値が正常でない場合、これが Python の正しい例外であることを理解しているため、AttributeError を返します。そのため、このプロパティを使用するコードの失敗と成功を確認する必要があります。したがって、MagicMock を使用してプロパティをモックし、例外を発生させます。些細な例は次のとおりです。

@x.setter
def x(self, value):
    if value < 0:
         raise AttributeError("Value cannot be negative!")
    self._x = value
4

2 に答える 2

4

えっと、電話を保留してください。これはあなたのユースケースをカバーしていますか?

>>> import mock
>>> m = mock.MagicMock()
>>> m.p
<MagicMock name='mock.p' id='139756843423248'>
>>> del m.p #!
>>> m.p
Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
     File "/home/ahammel/bin/python/mock-1.0.1-py2.6.egg/mock.py", line 664, in __getattr__
         raise AttributeError(name)
     AttributeError: p

まったく違うものを探しているときに、ドキュメントでそれを見つけました。

于 2013-11-27T17:41:32.080 に答える