2010-02-24 13 views
5

Bir işlev tarafından yükseltilen uyarı sayısını sayması gereken bazı testler var. Python 2.6 bu Python 2.4'tePython 2.4'de uyarıları sayma

with warnings.catch_warnings(record=True) as warn: 
    ... 
    self.assertEquals(len(warn), 2) 

Maalesef with kullanılamaz kullanarak, basit, bu yüzden başka ne kullanabiliriz? I yapamazsınız, tek bir uyarı olup olmadığını kontrol edin (uyarı filtresi action='error' ve try/catch kullanarak), çünkü uyarı sayısı önemlidir.

cevap

6

ben test kodu Ignacio aynı geçici çözümü, biraz daha eksiksiz bir örnek önerecektim
3

Yapabilecekleriniz, warnings.catch_warnings() davranışını kendiniz çoğaltmaktır. Geçerli değeri warnings.showwarning kaydedin ve bir listede uyarıyı kaydeden bir işlevle değiştirin, ardından rutin testin ardından listenin uzunluğunu sınayın ve sonra warnings.showwarning'u geri yükleyin.

import warnings 

def setup_warning_catcher(): 
    """ Wrap warnings.showwarning with code that records warnings. """ 


    caught_warnings = [] 
    original_showwarning = warnings.showwarning 

    def custom_showwarning(*args, **kwargs): 
     caught_warnings.append(args[0]) 
     return original_showwarning(*args, **kwargs) 

    warnings.showwarning = custom_showwarning 
    return caught_warnings 


caught_warnings_list = setup_warning_catcher() 

# trigger warning here 

assert len(caught_warnings_list) == 1 
:
oldsw = warnings.showwarning 
warnings.showwarning = myshowwarning 
    ... 
self.assertEquals(len(somewarninglist), 2) 
warnings.showwarning = oldsw