Last active
December 28, 2015 16:59
-
-
Save eculver/7533217 to your computer and use it in GitHub Desktop.
TestSettingsManager
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# This should be in a global namespace shared across your entire project | |
from django.conf import settings | |
NO_SETTING = ('!', None) | |
class TestSettingsManager(object): | |
""" | |
A class which can modify some Django settings temporarily for a | |
test and then revert them to their original values later. | |
Automatically handles resyncing the DB if INSTALLED_APPS is | |
modified. | |
""" | |
def __init__(self): | |
self._original_settings = {} | |
def syncdb(self): | |
loading.cache.loaded = False | |
call_command('syncdb', verbosity=0) | |
def set(self, **kwargs): | |
for k,v in kwargs.iteritems(): | |
self._original_settings.setdefault(k, getattr(settings, k, | |
NO_SETTING)) | |
setattr(settings, k, v) | |
if 'INSTALLED_APPS' in kwargs: | |
self.syncdb() | |
def revert(self): | |
for k,v in self._original_settings.iteritems(): | |
if v == NO_SETTING: | |
delattr(settings, k) | |
else: | |
setattr(settings, k, v) | |
if 'INSTALLED_APPS' in self._original_settings: | |
self.syncdb() | |
self._original_settings = {} | |
class SettingsTestCase(TestCase): | |
def __init__(self, *args, **kwargs): | |
super(SettingsTestCase, self).__init__(*args, **kwargs) | |
self.settings_manager = TestSettingsManager() | |
def tearDown(self): | |
self.settings_manager.revert() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from myapp.test import TestSettingsManager | |
# a module-level settings manager | |
SETTINGS_MANAGER = TestSettingsManager() | |
TEST_APPS = ( | |
'myproject.apps.appname', | |
'...', | |
'myproject.apps.appname.tests', | |
) | |
def setup(self): | |
SETTINGS_MANAGER.set(INSTALLED_APPS=TEST_APPS) | |
SETTINGS_MANAGER.syncdb() | |
def teardown(self): | |
SETTINGS_MANAGER.revert() | |
class SomethingTestCase(TestCase): | |
def test_foo(self): | |
self.assertTrue(True, "Yay") | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment