2010-08-27 30 views

Répondre

9
def your_code(): 
    # ... 
    warnings.warn("deprecated", DeprecationWarning) 
    # ... 

def your_test(): 
    with warnings.catch_warnings(record=True) as w: 
     your_code() 
     assert len(w) > 1 

Au lieu de simplement vérifier la longueur, vous pouvez le vérifier en profondeur, bien sûr:

assert str(w.args[0]) == "deprecated"

en Python 2.7 ou version ultérieure, vous pouvez le faire avec la dernière vérification que:

assert str(w[0].message[0]) == "deprecated"

+0

ne devrait pas être le test 'LEN (w)> 0', nous voulons juste vérifier si les avertissements'. La liste WarningMessage' est vide. Ou, suivant [PEP8] (https://www.python.org/dev/peps/pep-0008/#programming-recommendations), vérifiez que les séquences vides sont fausses –

1

Il y a (au moins) deux façons de le faire. Vous pouvez attraper l'avertissement dans le list de warnings.WarningMessage s dans le test ou utiliser mock à patch le warnings importé dans votre module. Je pense que la version patch est plus générale.

raise_warning.py:

import warnings 

def should_warn(): 
    warnings.warn('message', RuntimeWarning) 
    print('didn\'t I warn you?') 

raise_warning_tests.py:

import unittest 
from mock import patch 
import raise_warning 

class TestWarnings(unittest.TestCase): 

    @patch('raise_warning.warnings.warn') 
    def test_patched(self, mock_warnings): 
     """test with patched warnings""" 
     raise_warning.should_warn() 
     self.assertTrue(mock_warnings.called) 

    def test_that_catches_warning(self): 
     """test by catching warning""" 
     with raise_warning.warnings.catch_warnings(True) as wrn: 
      raise_warning.should_warn() 
      # per-PEP8 check for empty sequences by their Truthiness 
      self.assertTrue(wrn)