在Python 3中,如何在模块内修补功能以进行单元测试?

时间:2013-12-18 16:31:41

标签: python unit-testing mocking

我有一些方法可以将时序发送到托管的石墨实例,它们看起来像下面的内容

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

1 个答案:

答案 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,或直接在单元测试中使用它。