>>> from mock import *
>>> from urllib import request
>>> mock = Mock(spec=request.Request)
>>> mock.has_data()
<mock.Mock object at 0x...>
>>> mock.has_data.assret_called_with()
来自:https://docs.python.org/3/library/unittest.mock.html#autospeccing
1)声明怎么样&#34; mock.has_data()&#34;因为它在我的系统上抛出错误而工作? 我在请求库中找不到has_data()mentod。
2)假设即使我们有&#34; has_data()&#34;,我怀疑下面的调用是如何工作的并且没有抛出attirbute错误?
例如:mock.has_data.assret_called_with()
在我的情况下使用下面的示例它失败了但python文档中的上述示例并未报告任何错误
from mock import *
from urllib import request
mock = Mock(spec=request.Request)
mock.has_header()
mock.has_header.assret_called_with()
Traceback (most recent call last):
File ".\test2.py", line 5, in <module>
mock.has_header.assret_called_with()
File "C:\Users\hai\AppData\Local\Programs\Python\Python35-32\lib\site-packages\mock\mock.py", line 703, in __getattr__
raise AttributeError(name)
AttributeError: assret_called_with
请澄清,我对文件的理解或错误是否有问题?
答案 0 :(得分:0)
文档中的示例已过时(这是一个错误。You can help fixing it)。它的工作原理如Python 3.3所述。 mock.has_data()
应在Python 3.4+中引发AttributeError:
版本3.4中更改:自3.3以来已弃用的请求方法add_data,has_data,get_data,get_type,get_host,get_selector,get_origin_req_host和is_unverifiable已被删除。
文档应使用request.Request
对象(例如mock.has_header()
)上存在的方法。重点是说明mock.nonexisting
(AttributeError
如果request.Request
没有此类属性)和mock.some_existing_attribute.some_nonexisting_attribute
(后者不会提升AttributeError
甚至之间的差异如果mock.some_existing_attribute
没有some_nonexisting_attribute
属性):
>>> from unittest.mock import Mock
>>> from urllib import request
>>> mock = Mock(spec=request.Request)
>>> mock.has_header() # there is request.Request.has_header
<Mock name='mock.has_header()' id='174952746'>
>>> mock.nonexisting # there is no request.Request.nonexisting
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/...python3.6/unittest/mock.py", line 582, in __getattr__
raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute 'nonexisting'
Mock object has no attribute 'nonexisting'
>>> mock.has_header.nonexisting # no exception but there is no has_header.nonexisting
<Mock name='mock.has_header.nonexisting' id='249631353'>
换句话说,spec
不是递归的。