pow*_*wlo 9 python unit-testing mocking python-2.7 functools
我想测试一个我写的简单装饰器:
它看起来像这样:
#utilities.py
import other_module
def decor(f):
@wraps(f)
def wrapper(*args, **kwds):
other_module.startdoingsomething()
try:
return f(*args, **kwds)
finally:
other_module.enddoingsomething()
return wrapper
Run Code Online (Sandbox Code Playgroud)
然后我用python-mock测试它:
#test_utilities.py
def test_decor(self):
mock_func = Mock()
decorated_func = self.utilities.decor(mock_func)
decorated_func(1,2,3)
self.assertTrue(self.other_module.startdoingsomething.called)
self.assertTrue(self.other_module.enddoingsomething.called)
mock_func.assert_called_with(1,2,3)
Run Code Online (Sandbox Code Playgroud)
但它踢回来:
Traceback (most recent call last):
File "test_utilities.py", line 25, in test_decor
decorated_func = Mock(wraps=self.utilities.decor(mock_func))
File "utilities.py", line 35, in decor
@wraps(f)
File "/usr/lib/python2.7/functools.py", line 33, in update_wrapper
setattr(wrapper, attr, getattr(wrapped, attr))
File "/usr/local/lib/python2.7/dist-packages/mock.py", line 660, in __getattr__
raise AttributeError(name)
AttributeError: __name__
Run Code Online (Sandbox Code Playgroud)
我知道functools.wraps()只是一个帮手包装器.所以如果我把它拿出去测试就行了.
我可以让模拟玩functools.wraps()吗?
Python 2.7.3
Mar*_*ers 14
只需给你的模拟属性:
mock_func.__name__ = 'foo'
Run Code Online (Sandbox Code Playgroud)
真的是这样的.
演示:
>>> from functools import wraps
>>> from mock import Mock
>>> def decor(f):
... @wraps(f)
... def wrapper(*args, **kwds):
... return f(*args, **kwds)
... return wrapper
...
>>> mock_func = Mock()
>>> decor(mock_func)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in decor
File ".../opt/lib/python2.7/functools.py", line 33, in update_wrapper
setattr(wrapper, attr, getattr(wrapped, attr))
File ".../lib/python2.7/site-packages/mock.py", line 660, in __getattr__
raise AttributeError(name)
AttributeError: __name__
>>> mock_func.__name__ = 'foo'
>>> decor(mock_func)
<function foo at 0x10c4321b8>
Run Code Online (Sandbox Code Playgroud)
环境__name__
非常好; 所述@wraps
装饰简单地在拷贝__name__
属性来包装,并在该属性通常被设定为字符串值函数的对象.在任何情况下,它都是函数的可写属性,只要您使用字符串function.__name__
就可以设置为任何值.
归档时间: |
|
查看次数: |
2933 次 |
最近记录: |