浏览代码

Fixed #27019 -- Made teardown_test_environment() restore the old DEBUG.

Chris Jerdonek 8 年之前
父节点
当前提交
7f9fd42b93
共有 3 个文件被更改,包括 24 次插入6 次删除
  1. 1 3
      django/test/runner.py
  2. 15 2
      django/test/utils.py
  3. 8 1
      docs/topics/testing/advanced.txt

+ 1 - 3
django/test/runner.py

@@ -9,7 +9,6 @@ import textwrap
 import unittest
 import unittest
 from importlib import import_module
 from importlib import import_module
 
 
-from django.conf import settings
 from django.core.exceptions import ImproperlyConfigured
 from django.core.exceptions import ImproperlyConfigured
 from django.db import DEFAULT_DB_ALIAS, connections
 from django.db import DEFAULT_DB_ALIAS, connections
 from django.test import SimpleTestCase, TestCase
 from django.test import SimpleTestCase, TestCase
@@ -413,8 +412,7 @@ class DiscoverRunner(object):
         )
         )
 
 
     def setup_test_environment(self, **kwargs):
     def setup_test_environment(self, **kwargs):
-        setup_test_environment()
+        setup_test_environment(debug=self.debug_mode)
-        settings.DEBUG = self.debug_mode
         unittest.installHandler()
         unittest.installHandler()
 
 
     def build_suite(self, test_labels=None, extra_tests=None, **kwargs):
     def build_suite(self, test_labels=None, extra_tests=None, **kwargs):

+ 15 - 2
django/test/utils.py

@@ -94,18 +94,28 @@ def instrumented_test_render(self, context):
     return self.nodelist.render(context)
     return self.nodelist.render(context)
 
 
 
 
-def setup_test_environment():
+class _SavedSettings(object):
+    pass
+
+
+def setup_test_environment(debug=None):
     """
     """
     Perform global pre-test setup, such as installing the instrumented template
     Perform global pre-test setup, such as installing the instrumented template
     renderer and setting the email backend to the locmem email backend.
     renderer and setting the email backend to the locmem email backend.
     """
     """
-    if hasattr(Template, '_original_render'):
+    if hasattr(_SavedSettings, 'debug'):
         # Executing this function twice would overwrite the saved values.
         # Executing this function twice would overwrite the saved values.
         raise RuntimeError(
         raise RuntimeError(
             "setup_test_environment() was already called and can't be called "
             "setup_test_environment() was already called and can't be called "
             "again without first calling teardown_test_environment()."
             "again without first calling teardown_test_environment()."
         )
         )
 
 
+    if debug is None:
+        debug = settings.DEBUG
+
+    _SavedSettings.debug = settings.DEBUG
+    settings.DEBUG = debug
+
     Template._original_render = Template._render
     Template._original_render = Template._render
     Template._render = instrumented_test_render
     Template._render = instrumented_test_render
 
 
@@ -129,6 +139,9 @@ def teardown_test_environment():
     Perform any global post-test teardown, such as restoring the original
     Perform any global post-test teardown, such as restoring the original
     template renderer and restoring the email sending functions.
     template renderer and restoring the email sending functions.
     """
     """
+    settings.DEBUG = _SavedSettings.debug
+    del _SavedSettings.debug
+
     Template._render = Template._original_render
     Template._render = Template._original_render
     del Template._original_render
     del Template._original_render
 
 

+ 8 - 1
docs/topics/testing/advanced.txt

@@ -612,11 +612,18 @@ Testing utilities
 To assist in the creation of your own test runner, Django provides a number of
 To assist in the creation of your own test runner, Django provides a number of
 utility methods in the ``django.test.utils`` module.
 utility methods in the ``django.test.utils`` module.
 
 
-.. function:: setup_test_environment()
+.. function:: setup_test_environment(debug=None)
 
 
     Performs global pre-test setup, such as installing instrumentation for the
     Performs global pre-test setup, such as installing instrumentation for the
     template rendering system and setting up the dummy email outbox.
     template rendering system and setting up the dummy email outbox.
 
 
+    If ``debug`` isn't ``None``, the :setting:`DEBUG` setting is updated to its
+    value.
+
+    .. versionchanged:: 1.11
+
+        The ``debug`` argument was added.
+
 .. function:: teardown_test_environment()
 .. function:: teardown_test_environment()
 
 
     Performs global post-test teardown, such as removing instrumentation from
     Performs global post-test teardown, such as removing instrumentation from