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)
Okだから、デコレータregister_processor
は期待通りに動作します。テストは失敗しますが、内部クラスの名前をカスタマイズ可能にしたいので、代わりにデコレータファクトリの実装に行きました。unittestメソッドのデコレータファクトリ
私は、次の取得register_processor2
で飾られたテストを実行しているときのものです:バインドされた方法は、ここでTestPaymentMethodEndpoints
のインスタンスfunc
ではなく、なぜ
AttributeError: 'TestPaymentMethodEndpoints' object has no attribute '__name__'
これは@wraps(func)
から、私の質問はされます?
デコレータ@wraps
を削除した場合、テストが実行され、が渡されます。 func_wrapper
がtest_*
で始まらず、発見されてもテストが失敗するため、テストが検出されないことが期待されます。
何が起こっているかについての洞察とこれをどうやってやっていくのですか?
EDIT
だから私は、デコレータの工場は、あなたはまだそれを呼び出すとき()
を配置する必要があり、デフォルト値を持つ引数がある場合でも、それを考え出しました。
しかし、最初にテストが合格/発見された場合に何が起こったのかについての説明を聞くのが大好きです。
class TestPaymentMethodEndpoints(APITestCase):
@register_processor()
def test_put_detail_cannot_change_processor(self):
self.assertEqual(True, False)
私はそれについて考えるようになりました:D、あなたは毎日何か新しいことを学びます!
これは意味がありますが、最初にテストが合格したのはなぜですか?D。私はそれがすべきではないという意味です。 – Krotz
デコレータ工場の後にブラケットを入れない場合、いつ、いつか混乱する可能性はありますか?実際にデコレータ関数であるテストケースを作成したかもしれません。デコレータファクトリは、 'test_method'で呼び出されます。' 'デコレータファクトリは、' 'test_method''で呼び出されます。テストケースとして使用されるデコレータを返しますが、テストをラップする新しい関数を作成し、実際にはテストを実行しないので、渡すように見えます。 – daphtdazz
これは、テストを実行しているときに、アサーションエラーをキャッチし、テスト関数__name__に基づいて何らかのdictに失敗したテストを格納します。これはdictには含まれないため、無視されます。とにかく、私は本質的にそれの要点を持って、ありがとう。 – Krotz