Проверьте, что функция выдает предупреждение с помощью тестов на нос - PullRequest
7 голосов
/ 27 августа 2010

Я пишу модульные тесты, используя nose , и я хотел бы проверить, вызывает ли функция предупреждение (функция использует warnings.warn).Это легко сделать?

Ответы [ 2 ]

9 голосов
/ 27 августа 2010
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"

1 голос
/ 19 августа 2015

Есть (по крайней мере) два способа сделать это. Вы можете перехватить предупреждение в 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) 
...