2012-04-04 15 views
9

Bir dekoratörüm var ve kodumdaki bazı yöntemlerin onunla süslendiğini iddia etmek istiyorum.Bir yöntemin python unittest ile süslendiğini nasıl iddia edebilirim?

import functools 

def decorator(func): 
    def _check_something(*args, **kwargs): 
     # some logic in here 
     return func(*args, **kwargs) 
    return functools.wraps(func)(_check_something) 

class MyClass(object): 

    @decorator 
    def my_method(foo, bar): 
     pass 

nasıl my_method@decorator ve kimse kaldırdığını ve bu unutulmuş değildi sahip olduğunu unittest (unitttest2) ile iddia ederim?

+3

sınamak bazı kontrolleri yapın eğer bir "yöntem" olarak adlandırılan değil işlevi (Python, btw) doğru davranışı, doğru istisnaları vb. Yükselterek vb. Varsa, her şey yolunda. –

+0

, örneği yalnızca bir sarkan modül işlevi yerine gerçek bir yönteme sahip olacak şekilde güncelleştirdi. – Evgeny

+0

Ünite testleri ile, sadece fonksiyonun doğru şeyi yapıp yapmadığını test edin. Bütün bunlar, insanların işlevselliği bozmadıkları sürece gerçek uygulamayı istedikleri gibi yeniden düzenleyebilmeleridir. Ne yapmaya çalıştığın, birim testi ile ilgisi yok. –

cevap

2

Sarıcı işlevini bir öznitelikle işaretlemek için dekoratörünüze güvenerek bunu yapabilirsiniz.

Dekoratör, iade paketindeki orijinal işlevin işaret ettiği bir __wrapped__ özniteliği ayarlamalıdır.

böylece:

def decorator(func): 
    @functools.wraps(func) 
    def _check_something(*args, **kwargs): 
     # some logic in here 
     return func(*args, **kwargs) 
    _check_something.__wrapped__ = func # <== add this 
    return _check_something 

ardından, test kodu: Herhangi bir nedenle dekoratör değiştiremezsiniz Eğer

assert getattr(MyClass.my_method, "__wrapped__").__name__ == 'my_method' 
+1

Sarma işlevini tutan öznitelik ['__wrapped__'] olarak adlandırılmalıdır (http : //docs.python.org/py3k/library/functools.html#functools.update_wrapper). –

+0

Evggeny: Cevabım için yaptığınız düzenlemeleri test ettiniz mi? Python 2.x'te '__dict__' sınıfını kullanmadan retriveng hte yöntemi, size bir sınırlama metodu verir - fonksiyon nesnesi yok - Bağlı yöntemin, temel fonksiyonun '__wrapped__' özniteliğini kopyaladığını sanmıyorum. Oh - Şimdi test ettim, aslında metod nesnesi, fonksiyon nesnesi niteliklerine erişim sağlar - bunu bilmiyordum. – jsbueno

+0

http://pastie.org/3728502 – jsbueno

4

, ayrıca bir bazı karakteristik kontrol deneyin olabilir kapalı değişken. Örnekte

, özgün my_method dekoratör tarafından kapatıldı tek değişken olduğunu biliyoruz, bu yüzden olabilir:

assert (my_method.__closure__ and 
      my_method.__closure__[0].cell_contents.__name__ == my_method.__name__) 
İlgili konular