Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将Mock()传递到闪烁信号中。connect()引发;属性错误:“名称”;_Python_Unit Testing_Mocking - Fatal编程技术网

Python 将Mock()传递到闪烁信号中。connect()引发;属性错误:“名称”;

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

我正在重构现有代码,以使用blinker库,而不是传递回调函数。我有大量的现有测试,它们使用mock来检查回调是否正确启动。然而,当我尝试对使用blinker的新代码运行测试时,我从Mock中得到一个异常

该异常可以很容易地在repl上复制,原因是blinker试图访问模拟的
\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版测试过,示例代码也很有效