2010-02-10 12 views
12

@login_testuser yöntemine uygulanan @login_testuser dekolayıcısına sahip test_1:Bir sınıftaki yöntemlere python dekoratörlerini uygulama

class TestCase(object): 
    @login_testuser 
    def test_1(self): 
     print "test_1()" 

"test_" ile öntanımlı sınıfın her yönteminde @login_testuser uygulayabilmemin bir yolu var mı?

Diğer bir deyişle, dekoratör test_1, test_2 yöntemleri için geçerlidir, ancak setUp değerine uygulanmaz.

class TestCase(object): 
    def setUp(self): 
     pass 

    def test_1(self): 
     print "test_1()" 

    def test_2(self): 
     print "test_2()" 

cevap

18

Python 2.6'da, class decorator kesinlikle gitmek için bir yoldur. Sadece

@decallmethods(login_testuser) 
class TestCase(object): 
    def setUp(self): 
     pass 

    def test_1(self): 
     print "test_1()" 

    def test_2(self): 
     print "test_2()" 

ne arzu alırsınız, şimdi

import inspect 

def decallmethods(decorator, prefix='test_'): 
    def dectheclass(cls): 
    for name, m in inspect.getmembers(cls, inspect.ismethod): 
     if name.startswith(prefix): 
     setattr(cls, name, decorator(m)) 
    return cls 
    return dectheclass 

ve: Ör burada görevlerin bu tür için oldukça genel biri. Python 2.5 veya daha kötü olarak, @decallmethods sözdizimi sınıf dekorasyon için çalışmaz, ama aksi aynı kodla doğru class TestCase ifade neticede sonra aşağıdaki deyimi ile değiştirebilirsiniz:

TestCase = decallmethods(login_testuser)(TestCase) 
3

Elbette. Sınıfın tüm özelliklerini yineleyin. Yöntem olarak her birini kontrol edin ve ad "test_" ile başlıyorsa.

from inspect import ismethod, getmembers 
for name, obj in getmembers(TestCase, ismethod): 
    if name.startswith("test_"): 
     setattr(TestCase, name, login_testuser(obj)) 
+3

ben bunu bir sınıf dekoratörüne bile koyardı. – Wim

0

Evet, yapabilirsiniz üzerinde döngü sınıfı en dir/__dict__ veya nitelikleri ile başlarsanız tanımlayan yapar bir metaclass var ": Sonra dekoratörünün dönen fonksiyonu

şey gibi değiştirin Ölçek". Ancak, bu, dekoratörün açıkça yazılmasından daha basit, açık bir kod oluşturacaktır.

3

Bunun yerine login_testuser kodunu yerine setUp yazarak daha iyi olmayacağınızdan emin misiniz? SetUp ne içindir: Her test yönteminden önce çalışır.

+0

Öneri için teşekkürler, ancak dekoratörü yalnızca belirli bir öneki olan yöntemlere uygulamak istiyorum ve setUp tüm yöntemlere uygulanacaktır. –

+2

Belki bu yöntemleri kendi sınıflarına ayırın? Sihirli denetim ve yöntemlerin büyütülmesi, gizemli bir bakım baş ağrısına benziyor. –

İlgili konular