def register_processor2(processor_name='SomeProcessor'):
def decorator(func):
class SomeProcessor(GenericPaymentProcessor, TriggeredProcessorMixin):
name = processor_name
transaction_class = Transaction
@staticmethod
def setup(data=None):
pass
@wraps(func)
def func_wrapper(*args, **kwargs):
PaymentProcessorManager.register(SomeProcessor)
result = func(*args, **kwargs)
PaymentProcessorManager.unregister(SomeProcessor)
return result
return func_wrapper
return decorator
def register_processor(func):
class SomeProcessor(GenericPaymentProcessor, TriggeredProcessorMixin):
name = 'SomeProcessor'
transaction_class = Transaction
@staticmethod
def setup(data=None):
pass
@wraps(func)
def func_wrapper(*args, **kwargs):
PaymentProcessorManager.register(SomeProcessor)
result = func(*args, **kwargs)
PaymentProcessorManager.unregister(SomeProcessor)
return result
return func_wrapper
class TestPaymentMethodEndpoints(APITestCase):
@register_processor
def test_put_detail_cannot_change_processor(self):
self.assertEqual(True, False)
好吧,所以装饰工register_processor
按预期工作。测试失败,但我想让内部类的名称可定制,所以我改为装饰工厂实现。单元测试方法的装饰工厂
的事情是运行测试饰register_processor2
时,我得到如下:
AttributeError: 'TestPaymentMethodEndpoints' object has no attribute '__name__'
这是从@wraps(func)
,我的问题是,为什么是func
这里的TestPaymentMethodEndpoints
一个实例,而不是绑定的方法?
此外,如果我删除@wraps
修饰器,然后测试运行并通过。 我希望测试不会被发现,因为func_wrapper
不以test_*
开头,即使发现它也会失败。
任何有关正在发生的事情以及我将如何去做这件事的见解?
编辑
所以我想通了,即使装饰工厂有有你仍然需要调用它时放置()
默认值的参数。
但是仍然希望听到关于在测试通过/发现的情况下发生了什么的解释。
class TestPaymentMethodEndpoints(APITestCase):
@register_processor()
def test_put_detail_cannot_change_processor(self):
self.assertEqual(True, False)
现在我觉得有意义了:D,天哪,你每天都会学到新的东西!
好吧,这是有道理的,但为什么测试通过首先:D。我的意思是它不应该。 – Krotz
您是否有可能在装修工厂之后和何时不把括号放在后面而感到困惑?您可能已经创建了一个实际上只是装饰器功能的测试用例,例如'def decorator_factory(* args,** kwargs):... return decorator',然后是'@decorator_factory def test_method(self):self.assertEqual(True,False)',因此这里的装饰器工厂用'test_method'调用并返回一个用作测试用例的装饰器,但它只是创建一个包装测试的新函数,并且实际上并不运行测试,所以看起来会通过。 – daphtdazz
无论是运行测试还是运行测试时,它都会捕获断言错误,并将失败的测试存储在基于测试函数__name__的字典中,该测试函数__name__不在字典中,因此它忽略它。无论如何,我从本质上得到了它的要义,谢谢。 – Krotz