Prüfen Sie, ob eine Funktion eine Warnung mit Nasentests auslöst

Ich schreibe Unit-Tests mit Nase , und ich möchte überprüfen, ob eine Funktion eine Warnung auslöst (die Funktion verwendet warnings.warn ). Ist das etwas, was leicht gemacht werden kann?

    2 Solutions collect form web for “Prüfen Sie, ob eine Funktion eine Warnung mit Nasentests auslöst”

     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 zu überprüfen, kannst du es eingehen, natürlich:

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

    In python 2.7 oder später können Sie dies mit der letzten Prüfung als:

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

    Es gibt (mindestens) zwei Möglichkeiten, dies zu tun. Sie können die Warnung in der list der warnings.WarningMessage s im Test oder verwenden Sie mock um die importierten warnings in Ihrem Modul zu patch .

    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) 
    Python ist die beste Programmiersprache der Welt.