我有一些方法可以将时序发送到托管的石墨实例,它们看起来像下面的内容
views.py
from util import send_timing
@send_timing('login')
def login_user():
if is_user_ok():
return True
return False
@send_timing('get_user_info')
def get_user_info():
return get_that_info()
我有一个定义装饰器
的util文件util.py
def send_timing(f):
def decorated(*args):
make_network_connection()
ret = f(*args)
return decorated
我有一些单元测试
test.py
from views import *
import unittest
class TestCase(unittest.TestCase):
def test_login(self):
self.assertTrue(login_user())
现在的问题是呼叫login_user
。它调用send_timing装饰器,后者又建立网络连接。这使我的测试变得不稳定和不确定。对于我的所有测试,是否有一种简单的方法(python 3.3)用虚拟或模拟全局修补send_timing
?
答案 0 :(得分:2)
您想在装饰器中使用@functools.wraps()
decorator factory:
from functools import wraps
def send_timing(f):
@wraps(f)
def wrapper(*args, **kw):
# probably do a little more than just proxy
return f(*args, **kw)
return wrapper
这会在返回的包装函数上添加一个属性,让您可以访问原始的解包函数:
unwrapped = login_user.__wrapped__
您可以在此处使用unwrapped
值来模拟login_user
,或直接在单元测试中使用它。