我正在重构现有代码以使用blinker库而不是传递回调函数。我有一大堆现有的测试,它们使用mock来检查回调是否正确触发。但是,当我尝试针对使用blinker的新代码运行测试时,我从Mock中获得了一个异常。
可以在repl上轻松复制异常,这是因为blinker试图访问模拟的__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个测试。
答案 0 :(得分:2)
我找到了一个解决方案:
创建一个虚拟函数,并在规范成功时将其传递给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
答案 1 :(得分:1)
<强>速记强>
from mock import MagicMock
mock_signal = MagicMock(spec={})