Przeglądaj źródła

Deprecated undocumented warnings manipulation testing tools.

Ramiro Morales 12 lat temu
rodzic
commit
7947c9e3a6

+ 14 - 7
django/test/testcases.py

@@ -1,12 +1,13 @@
 from __future__ import unicode_literals
 
+from copy import copy
 import difflib
+import errno
+from functools import wraps
 import json
 import os
 import re
 import sys
-from copy import copy
-from functools import wraps
 try:
     from urllib.parse import urlsplit, urlunsplit
 except ImportError:     # Python 2
@@ -14,7 +15,7 @@ except ImportError:     # Python 2
 import select
 import socket
 import threading
-import errno
+import warnings
 
 from django.conf import settings
 from django.contrib.staticfiles.handlers import StaticFilesHandler
@@ -36,8 +37,7 @@ from django.test import _doctest as doctest
 from django.test.client import Client
 from django.test.html import HTMLParseError, parse_html
 from django.test.signals import template_rendered
-from django.test.utils import (get_warnings_state, restore_warnings_state,
-    override_settings, compare_xml, strip_quotes)
+from django.test.utils import (override_settings, compare_xml, strip_quotes)
 from django.test.utils import ContextList
 from django.utils import unittest as ut2
 from django.utils.encoding import force_text
@@ -241,6 +241,11 @@ class _AssertTemplateNotUsedContext(_AssertTemplateUsedContext):
 
 
 class SimpleTestCase(ut2.TestCase):
+
+    _warn_txt = ("save_warnings_state/restore_warnings_state "
+        "django.test.*TestCase methods are deprecated. Use Python's "
+        "warnings.catch_warnings context manager instead.")
+
     def __call__(self, result=None):
         """
         Wrapper around default __call__ method to perform common Django test
@@ -279,14 +284,16 @@ class SimpleTestCase(ut2.TestCase):
         """
         Saves the state of the warnings module
         """
-        self._warnings_state = get_warnings_state()
+        warnings.warn(self._warn_txt, DeprecationWarning, stacklevel=2)
+        self._warnings_state = warnings.filters[:]
 
     def restore_warnings_state(self):
         """
         Restores the state of the warnings module to the state
         saved by save_warnings_state()
         """
-        restore_warnings_state(self._warnings_state)
+        warnings.warn(self._warn_txt, DeprecationWarning, stacklevel=2)
+        warnings.filters = self._warnings_state[:]
 
     def settings(self, **kwargs):
         """

+ 7 - 0
django/test/utils.py

@@ -98,6 +98,11 @@ def teardown_test_environment():
     del mail.outbox
 
 
+warn_txt = ("get_warnings_state/restore_warnings_state functions from "
+    "django.test.utils are deprecated. Use Python's warnings.catch_warnings() "
+    "context manager instead.")
+
+
 def get_warnings_state():
     """
     Returns an object containing the state of the warnings module
@@ -105,6 +110,7 @@ def get_warnings_state():
     # There is no public interface for doing this, but this implementation of
     # get_warnings_state and restore_warnings_state appears to work on Python
     # 2.4 to 2.7.
+    warnings.warn(warn_txt, DeprecationWarning, stacklevel=2)
     return warnings.filters[:]
 
 
@@ -113,6 +119,7 @@ def restore_warnings_state(state):
     Restores the state of the warnings module when passed an object that was
     returned by get_warnings_state()
     """
+    warnings.warn(warn_txt, DeprecationWarning, stacklevel=2)
     warnings.filters = state[:]
 
 

+ 7 - 1
docs/internals/deprecation.txt

@@ -267,7 +267,6 @@ these changes.
   in 1.4. The backward compatibility will be removed --
   ``HttpRequest.raw_post_data`` will no longer work.
 
-
 * The value for the ``post_url_continue`` parameter in
   ``ModelAdmin.response_add()`` will have to be either ``None`` (to redirect
   to the newly created object's edit page) or a pre-formatted url. String
@@ -314,6 +313,13 @@ these changes.
 * The ``depth`` keyword argument will be removed from
   :meth:`~django.db.models.query.QuerySet.select_related`.
 
+* The undocumented ``get_warnings_state()``/``restore_warnings_state()``
+  functions from :mod:`django.test.utils` and the ``save_warnings_state()``/
+  ``restore_warnings_state()``
+  :ref:`django.test.*TestCase <django-testcase-subclasses>` methods are
+  deprecated. Use the :class:`warnings.catch_warnings` context manager
+  available starting with Python 2.6 instead.
+
 1.8
 ---
 

+ 2 - 0
docs/topics/testing/overview.txt

@@ -835,6 +835,8 @@ The following is a simple unit test using the test client::
 
     :class:`django.test.client.RequestFactory`
 
+.. _django-testcase-subclasses:
+
 Provided test case classes
 --------------------------
 

+ 17 - 14
tests/regressiontests/test_utils/tests.py

@@ -220,24 +220,27 @@ class SaveRestoreWarningState(TestCase):
         # of save_warnings_state/restore_warnings_state (e.g. just
         # warnings.resetwarnings()) , but it is difficult to test more.
         import warnings
-        self.save_warnings_state()
+        with warnings.catch_warnings():
+            warnings.simplefilter("ignore", DeprecationWarning)
 
-        class MyWarning(Warning):
-            pass
+            self.save_warnings_state()
+
+            class MyWarning(Warning):
+                pass
 
-        # Add a filter that causes an exception to be thrown, so we can catch it
-        warnings.simplefilter("error", MyWarning)
-        self.assertRaises(Warning, lambda: warnings.warn("warn", MyWarning))
+            # Add a filter that causes an exception to be thrown, so we can catch it
+            warnings.simplefilter("error", MyWarning)
+            self.assertRaises(Warning, lambda: warnings.warn("warn", MyWarning))
 
-        # Now restore.
-        self.restore_warnings_state()
-        # After restoring, we shouldn't get an exception. But we don't want a
-        # warning printed either, so we have to silence the warning.
-        warnings.simplefilter("ignore", MyWarning)
-        warnings.warn("warn", MyWarning)
+            # Now restore.
+            self.restore_warnings_state()
+            # After restoring, we shouldn't get an exception. But we don't want a
+            # warning printed either, so we have to silence the warning.
+            warnings.simplefilter("ignore", MyWarning)
+            warnings.warn("warn", MyWarning)
 
-        # Remove the filter we just added.
-        self.restore_warnings_state()
+            # Remove the filter we just added.
+            self.restore_warnings_state()
 
 
 class HTMLEqualTests(TestCase):