watch this The wheels are turning, slowly turning. home
Warnings unit test helper 2007-06-08

Trial’s TestCase offers a new helper method in Twisted trunk@HEAD, assertWarns. This makes it trivial to test that a particular function call emits a warning which satisfies some condition. For example, this is useful for verifying that an API which is supposed to be deprecated is actually deprecated:

from twisted.trial.unittest import TestCase

def someFunction(input):
    """
    Map inputs to outputs.
    """


class FunctionTests(TestCase):
    """
    Tests for L{someFunction}.
    """

    def test_deprecation(self):
        """
        Calling L{someFunction} should emit a L{DeprecationWarning}.
        """
        self.assertWarns(
            DeprecationWarning,
            ("someFunction is deprecated, use anotherFunction instead",),
            __file__,
            someFunction, 3)



Before adding the warning, this fails:

$ trial assertwarns.py
Running 1 tests.
assertwarns
  FunctionTests
    test_deprecation ...                                                 [FAIL]

===============================================================================
[FAIL]: assertwarns.FunctionTests.test_deprecation

Traceback (most recent call last):
  File "/home/exarkun/assertwarns.py", line 22, in test_deprecation
    someFunction, 3)
  File "/home/exarkun/Projects/Twisted/trunk/twisted/trial/unittest.py", line 346, in failUnlessWarns
    self.assertEqual(len(warningsShown), 1, pformat(warningsShown))
twisted.trial.unittest.FailTest: []
-------------------------------------------------------------------------------
Ran 1 tests in 0.009s

FAILED (failures=1)



After changing the definition of someFunction to this:

import warnings

def someFunction(input):
    """
    Map inputs to outputs.
    """
    warnings.warn(
        "someFunction is deprecated, use anotherFunction instead",
        category=DeprecationWarning)



the tests pass:

$ trial assertwarns.py
Running 1 tests.
assertwarns
  FunctionTests
    test_deprecation ...                                                   [OK]

-------------------------------------------------------------------------------
Ran 1 tests in 0.003s

PASSED (successes=1)