summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2013-10-14 10:44:55 +0200
committerClaude Paroz <claude@2xlibre.net>2013-10-15 15:38:27 +0200
commit949076eb11011736f9e827adfde03c842bc1f1dd (patch)
tree43c928be37ce895705f613df96f23eb401529d01
parentc7634cd7fe7dc09338fcec0ca48d816a29d791b0 (diff)
Fixed #21263 -- Fixed issue with override_settings in inherited classes
When both parent and child classes are decorated with override_settings, child class settings should take precedence. Thanks Sephi for the report and Marc Tamlyn for the review.
-rw-r--r--django/test/testcases.py6
-rw-r--r--django/test/utils.py17
-rw-r--r--tests/settings_tests/tests.py10
3 files changed, 21 insertions, 12 deletions
diff --git a/django/test/testcases.py b/django/test/testcases.py
index 3f0046314e..3ce96b09b9 100644
--- a/django/test/testcases.py
+++ b/django/test/testcases.py
@@ -157,6 +157,7 @@ class SimpleTestCase(unittest.TestCase):
# The class we'll use for the test client self.client.
# Can be overridden in derived classes.
client_class = Client
+ _custom_settings = None
def __call__(self, result=None):
"""
@@ -193,6 +194,9 @@ class SimpleTestCase(unittest.TestCase):
* If the class has a 'urls' attribute, replace ROOT_URLCONF with it.
* Clearing the mail test outbox.
"""
+ if self._custom_settings:
+ self._overridden = override_settings(**self._custom_settings)
+ self._overridden.enable()
self.client = self.client_class()
self._urlconf_setup()
mail.outbox = []
@@ -210,6 +214,8 @@ class SimpleTestCase(unittest.TestCase):
* Putting back the original ROOT_URLCONF if it was changed.
"""
self._urlconf_teardown()
+ if self._custom_settings:
+ self._overridden.disable()
def _urlconf_teardown(self):
set_urlconf(None)
diff --git a/django/test/utils.py b/django/test/utils.py
index cd3e99d58b..ae045a5283 100644
--- a/django/test/utils.py
+++ b/django/test/utils.py
@@ -203,18 +203,11 @@ class override_settings(object):
raise Exception(
"Only subclasses of Django SimpleTestCase can be decorated "
"with override_settings")
- original_pre_setup = test_func._pre_setup
- original_post_teardown = test_func._post_teardown
-
- def _pre_setup(innerself):
- self.enable()
- original_pre_setup(innerself)
-
- def _post_teardown(innerself):
- original_post_teardown(innerself)
- self.disable()
- test_func._pre_setup = _pre_setup
- test_func._post_teardown = _post_teardown
+ if test_func._custom_settings:
+ test_func._custom_settings = dict(
+ test_func._custom_settings, **self.options)
+ else:
+ test_func._custom_settings = self.options
return test_func
else:
@wraps(test_func)
diff --git a/tests/settings_tests/tests.py b/tests/settings_tests/tests.py
index a9503358a2..4a0c363c39 100644
--- a/tests/settings_tests/tests.py
+++ b/tests/settings_tests/tests.py
@@ -73,6 +73,16 @@ class ClassDecoratedTestCase(ClassDecoratedTestCaseSuper):
self.fail()
+@override_settings(TEST='override-parent')
+class ParentDecoratedTestCase(TestCase):
+ pass
+
+@override_settings(TEST='override-child')
+class ChildDecoratedTestCase(ParentDecoratedTestCase):
+ def test_override_settings_inheritance(self):
+ self.assertEqual(settings.TEST, 'override-child')
+
+
class SettingsTests(TestCase):
def setUp(self):
self.testvalue = None