2010-02-24 6 views
5

J'ai des tests qui doivent compter le nombre d'avertissements déclenchés par une fonction. En Python 2.6 est simple, utiliseAvertissements de compte en Python 2.4

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

Malheureusement, with n'est pas disponible en Python 2.4, que pourrais-je utiliser? I ne peut pas simplement vérifier s'il y a eu un seul avertissement (en utilisant le filtre d'avertissement avec action='error' et try/catch), parce que le nombre d'avertissements est important.

Répondre

6

Je voulais vous proposer la même solution que Ignacio, un peu plus complet exemple de code de test:

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 
3

Ce que vous pouvez faire est de dupliquer le comportement de warnings.catch_warnings() vous-même. Enregistrer la valeur actuelle de warnings.showwarning et le remplacer par une fonction qui enregistre l'avertissement dans une liste, puis après la routine de tester la longueur de la liste, puis restaurer warnings.showwarning.

oldsw = warnings.showwarning 
warnings.showwarning = myshowwarning 
    ... 
self.assertEquals(len(somewarninglist), 2) 
warnings.showwarning = oldsw 
Questions connexes