3

コールバック関数を渡すのではなく、ブリンカー ライブラリを使用するように既存のコードをリファクタリング中です。コールバックが正しく起動されることを確認するためにモックを使用する既存のテストの大規模なセットがあります。ただし、ブリンカーを使用する新しいコードに対してテストを実行しようとすると、モック内から例外が発生します。

例外は repl で簡単に複製でき、これはブリンカー__name__がモックの属性にアクセスしようとしていることが原因です。

>>> from mock import Mock
>>> from blinker import signal
>>>
>>> test = signal('test')
>>> m = Mock()
>>>
>>> test.connect(m)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/ed/.virtualenvs/iws/lib/python2.7/site-packages/blinker/base.py", line 113, in connect
      receiver_ref = reference(receiver, self._cleanup_receiver)
  File "/Users/ed/.virtualenvs/iws/lib/python2.7/site-packages/blinker/_utilities.py", line 124, in reference
      weak = callable_reference(object, callback)
  File "/Users/ed/.virtualenvs/iws/lib/python2.7/site-packages/blinker/_utilities.py", line 135, in callable_reference
      return BoundMethodWeakref(target=object, on_delete=callback)
  File "/Users/ed/.virtualenvs/iws/lib/python2.7/site-packages/blinker/_saferef.py", line 143, in __new__
      base.__init__(target, on_delete, *arguments, **named)
  File "/Users/ed/.virtualenvs/iws/lib/python2.7/site-packages/blinker/_saferef.py", line 188, in __init__
      self.func_name = str(im_func.__name__)
  File "/Users/ed/.virtualenvs/iws/lib/python2.7/site-packages/mock.py", line 702, in __getattr__
      raise AttributeError(name)

MagicMock は同じ例外を発生させます。

例外が発生しないようにモックを準備する方法を理解できませんでした。モックをダミー関数に置き換えて、その中にテストを書くこともできますが、1000 以上のテストがあります。

4

2 に答える 2

3

私は解決策を見つけました:

ダミー関数を作成し、それをスペックとしてモックに渡すと成功します。

>>> from blinker import signal
>>> from mock import Mock
>>>
>>> def foo():
...     pass
...
>>> t = signal('test')
>>> m = Mock(spec=foo)
>>> m.__name__
<Mock name='mock.__name__' id='4471403152'>
>>> t.connect(m)
<Mock spec='function' id='4471883984'>
>>> t.send()
[(<Mock spec='function' id='4471883984'>, <Mock name='mock()' id='4471404624'>)]
>>> m.called
True
于 2013-10-24T15:08:59.067 に答える
2

速記

from mock import MagicMock    
mock_signal = MagicMock(spec={})
于 2016-12-16T08:42:48.683 に答える