簡體   English   中英

將Mock()傳遞給blinker signal.connect()會引發“AttributeError:__name__”

[英]Passing a Mock() into blinker signal.connect() raises “AttributeError: __name__”

我正在重構現有代碼以使用blinker庫而不是傳遞回調函數。 我有一大堆現有的測試,它們使用mock來檢查回調是否正確觸發。 但是,當我嘗試針對使用blinker的新代碼運行測試時,我從Mock中獲得了一個異常。

異常可以很容易地在repl上復制,並且是由於blinker試圖訪問mock的__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個測試。

我找到了一個解決方案:

創建一個虛擬函數,並在規范成功時將其傳遞給mock。

>>> 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

速記

from mock import MagicMock    
mock_signal = MagicMock(spec={})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM