Python 将Mock()传递到闪烁信号中。connect()引发;属性错误:“名称”;
我正在重构现有代码,以使用blinker库,而不是传递回调函数。我有大量的现有测试,它们使用mock来检查回调是否正确启动。然而,当我尝试对使用blinker的新代码运行测试时,我从Mock中得到一个异常 该异常可以很容易地在repl上复制,原因是blinker试图访问模拟的Python 将Mock()传递到闪烁信号中。connect()引发;属性错误:“名称”;,python,unit-testing,mocking,Python,Unit Testing,Mocking,我正在重构现有代码,以使用blinker库,而不是传递回调函数。我有大量的现有测试,它们使用mock来检查回调是否正确启动。然而,当我尝试对使用blinker的新代码运行测试时,我从Mock中得到一个异常 该异常可以很容易地在repl上复制,原因是blinker试图访问模拟的\uuu name\uuuu属性 >>> from mock import Mock >>> from blinker import signal >>> >>
\uuu name\uuuu
属性
>>> 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)
来自模拟导入模拟的>>
>>>从闪烁输入信号
>>>
>>>测试=信号(“测试”)
>>>m=Mock()
>>>
>>>测试连接(m)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Users/ed/.virtualenvs/iws/lib/python2.7/site packages/blinker/base.py”,第113行,在connect中
接收器\u ref=参考(接收器,自清洁\u接收器)
文件“/Users/ed/.virtualenvs/iws/lib/python2.7/site packages/blinker/_utilities.py”,参考文献第124行
弱=可调用的_引用(对象,回调)
文件“/Users/ed/.virtualenvs/iws/lib/python2.7/site packages/blinker/_utilities.py”,第135行,可调用的_参考
返回BoundMethodWeakref(目标=对象,on_delete=回调)
文件“/Users/ed/.virtualenvs/iws/lib/python2.7/site packages/blinker/\u saferef.py”,第143行,新__
base.\uuuu init\uuuu(目标,在删除时,*参数,**命名)
文件“/Users/ed/.virtualenvs/iws/lib/python2.7/site-packages/blinker/_-saferef.py”,第188行,在u-init中__
self.func\u name=str(im\u func.\u name\u)
文件“/Users/ed/.virtualenvs/iws/lib/python2.7/site packages/mock.py”,第702行,在__
提升属性错误(名称)
MagicMock引发相同的异常
我还没有弄清楚如何准备mock,这样就不会引发异常。我可以用一个虚拟函数替换mock并在其中编写测试,但我有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
来自闪烁输入信号的>>
>>>从mock导入mock
>>>
>>>def foo():
... 通过
...
>>>t=信号(‘测试’)
>>>m=Mock(spec=foo)
>>>m.。_u姓名__
>>>t.connect(m)
>>>t.send()
[(, )]
>>>m.打电话来
真的
速记
from mock import MagicMock
mock_signal = MagicMock(spec={})
您可以发布连接的代码吗?在某个点上,某个属性的某个属性。。。模拟对象的属性应该是函数对象,它将具有
im\u func
属性。您必须正确配置您的模拟,以便它与您的代码一起工作。这对我不起作用,我在调用t.connect(m)时得到“TypeError:无法连接'str'和'mock'对象”。我使用的是blinker 1.3和mock 1.0.0。我使用的是mock 0.8.0和blinker 1.3-这两个版本都很有效-我将快速了解mock 1.0.0,它刚刚用mock 1.0.1版测试过,示例代码也很有效