[英]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.