django-override-settings provides an easy way to override settings in Django tests.
override_settings class can be used as either a class or
method decorator or as a context manager to temporarily override the
values of settings. After each test case has finished (when using it
as a decorator) or after the context manager has exited, it resets the
django.conf.settings to what they were before. This prevents
side-effects from creeping in and lets each test case run in its own
This package also provides two convenience functions (
without_apps) to modify just
INSTALLED_APPS as well as a
special object (
SETTING_DELETED) to run tests without a given
The functionality in this package will eventually be superseded when
Django 1.4 is released as it will come with a built-in
override_settings. But for those maintaining pre-1.4 codebases,
hopefully this package comes in handy.
We're on PyPI:
pip install django-override-settings
If you have a bunch of tests that require a given setting, you can decorate the class and each test case will use that value. For example:
from django.conf import settings from django.test import TestCase from override_settings import override_settings @override_settings(FOO="abc") class TestFoo(TestCase): def test_foo(self): self.assertEqual(settings.FOO, "abc")
Or you can decorate a single test case and have it only apply on that method:
@override_settings(BAR="123") class TestBar(TestCase): @override_settings(BAR="abc") def test_bar(self): self.assertEqual(settings.BAR, "abc") def test_bar_no_decoration(self): self.assertEqual(settings.BAR, "123")
You can also use it as a context manager:
class TestBar(TestCase): @override_settings(BAR="123") def test_bar(self): self.assertEqual(settings.BAR, "123") with override_settings(BAR="abc") self.assertEqual(settings.BAR, "abc") self.assertEqual(settings.BAR, "123")
To modify just
from override_settings import with_apps, without_apps class TestAppModifiers(TestCase): @with_apps('django.contrib.humanize') def test_humanize(self): # ... @without_apps('django.contrib.sites') def test_no_sites(self): # ...
To run tests without a setting, use
from override_settings import override_settings, SETTING_DELETED class TestMissingSetting(TestCase): @override_settings(CUSTOM_OPTION=SETTING_DELETED) def test_delete_custom_option(self): """ Useful to make sure a missing setting raises an Exception. """ self.assertRaises(AttributeError, getattr, settings, 'CUSTOM_OPTION')
Works on Python 2.6 and 2.7 with Django 1.2.x and 1.3.x
- Jannis Leidel for both the original snippet and his work updating it to work when decorating TestCases as part of Django proper.
- Joost Cassee for the idea of
SETTING_DELETEDas well as
without_appsas part of his django-analytical project.
If you notice any bugs, please open a ticket.