2010-08-27 4 views

Antwort

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 

Anstatt nur die Länge überprüfen, können Sie es im Detail überprüfen, natürlich:

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

In Python 2.7 oder höher, können Sie dies mit der letzten Prüfung tun können, wie:

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

+0

sollte nicht den Test 'len werden (w)> 0 ', wir wollen nur, wenn die' Warnungen überprüfen. WarningMessage-Liste ist leer. Oder testen Sie nach [PEP8] (https://www.python.org/dev/peps/pep-0008/#programming-recommendations) einfach, ob leere Sequenzen falsch sind –

1

Es gibt (mindestens) zwei Möglichkeiten dies zu tun. Sie können die Warnung im list von warnings.WarningMessage s im Test abfangen oder mock bis patch das importierte warnings in Ihrem Modul verwenden.

Ich denke, die patch Version ist allgemeiner.

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) 
Verwandte Themen