我正在使用鼻子测试生成器功能在不同的上下文中运行相同的测试。由于每个测试都需要以下样板:
class TestSample(TestBase):
def test_sample(self):
for context in contexts:
yield self.check_sample, context
def check_sample(self, context):
"""The real test logic is implemented here"""
pass
我决定编写以下装饰器:
def with_contexts(contexts=None):
if contexts is None:
contexts = ['twitter', 'linkedin', 'facebook']
def decorator(f):
@wraps(f)
def wrapper(self, *args, **kwargs):
for context in contexts:
yield f, self, context # The line which causes the error
return wrapper
return decorator
装饰器的使用方式如下:
class TestSample(TestBase):
@with_contexts()
def test_sample(self, context):
"""The real test logic is implemented here"""
var1 = self.some_valid_attribute
当测试执行时,会抛出一个错误,指定正在访问的属性不可用。但是,如果我将调用该方法的行更改为以下内容,则它可以正常工作:
yield getattr(self, f.__name__), service
我知道上面的代码片段创建了一个绑定方法,其中第一个self被手动传递给函数。但是,据我的理解,第一个片段也应该可以正常工作。如果有人能澄清这个问题,我将不胜感激。
问题的标题通常与在装饰器中调用实例方法有关,但我保留了特定于我的上下文的描述。