noseを使用して単体テストを作成していますが、関数が警告を発するかどうかを確認したいと思います(関数はを使用しますwarnings.warn
)。これは簡単にできることですか?
1970 次
2 に答える
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
もちろん、長さを確認するだけでなく、詳細に確認することもできます。
assert str(w.args[0]) == "deprecated"
Python 2.7以降では、次のように最後のチェックでこれを行うことができます。
assert str(w[0].message[0]) == "deprecated"
于 2010-08-27T19:41:26.763 に答える
1
これを行うには(少なくとも)2つの方法があります。テスト中のので警告をキャッチするかlist
、モジュールにインポートされたものに使用できます。warnings.WarningMessage
mock
patch
warnings
patch
バージョンはもっと一般的だと思います。
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)
于 2015-08-19T07:30:40.153 に答える