【发布时间】:2019-10-20 19:21:50
【问题描述】:
我正在尝试测试下面的装饰器 test_params 以进行单元测试,但是当我尝试在函数 test_testparams 中调用它时,出现错误:
TypeError: wrapper() takes exactly 1 argument (0 given)
是因为它在期待自己吗?
import unittest
import functools
def test_params(kwargs_lst):
'''allows to parametrise tests easily using a decorator'''
def decorator(fn):
@functools.wraps(fn)
def wrapper(self):
for kwargs in kwargs_lst:
fn(self, **kwargs)
return wrapper
return decorator
TEST_PARAMS_ARGS = [
{'arg1': 1, 'arg2': None, 'arg3': "test"},
]
RECORDER = []
class TestParamsClass(object):
def record_args(self, arg1, arg2, arg3):
RECORDER.append({'arg1': arg1, 'arg2': arg2, 'arg3': arg3})
class DecoratorTest(unittest.TestCase):
def setUp(self):
pass
def test_testparams(self):
obj = TestParamsClass()
decorated_fn = test_params(TEST_PARAMS_ARGS)(obj.record_args)
decorated_fn()
print("RECORDED:{}".format(RECORDER))
为了全面披露,我已经尝试过传递 self 参数:
decorated_fn(obj)
但这会报错:
TypeError: record_args() got multiple values for keyword argument 'arg1'
我也尝试过使用:
from functools import partial
decorated_fn = test_params(TEST_PARAMS_ARGS)(partial(obj.record_args, self=obj))
这给了我错误:
AttributeError: 'functools.partial' object has no attribute '__module__'
有 self 参数的原因是它通常在测试函数中用于传递参数,并且测试函数在 unittest.TestCase 中。
【问题讨论】:
-
好吧,你调用
decorated_fn(),没有为预期的self参数传递参数…… -
@deceze,你能举个例子吗,我试着把 obj 放在 self 上,但不能让它工作。我已经编辑了我的答案。
-
你为什么把
self放在那里?我的意思是,不应该只是def wrapper(),没有任何争论吗?执行fn也不应该采用self- self 仅在类中相关,其中函数是方法,因此它们在一些 self 对象上执行 - 当你执行obj.record_args时,你已经给出了函数已设置self。 -
我有 self 的原因是它通常用于函数内部测试以将测试参数作为 kwargs 传递,我会更新
标签: python python-2.7