How to Unit test with different settings in Django?
django, django-managers, settings, testing
Solution
EDIT: This answer applies if you want to change settings for a small number of specific tests.
Since Django 1.4, there are ways to override settings during tests: https://docs.djangoproject.com/en/stable/topics/testing/tools/#overriding-settings
`TestCase` will have a `self.settings` context manager, and there will also be an `@override_settings` decorator that can be applied to either a test method or a whole `TestCase` subclass.
These features did not exist yet in Django 1.3.
If you want to change settings for all your tests, you'll want to create a separate settings file for test, which can load and override settings from your main settings file. There are several good approaches to this in the other answers; I have seen successful variations on both hspander's and dmitrii's approaches.
Problem
Is there any simple mechanism for overriding Django settings for a unit test? I have a manager on one of my models that returns a specific number of the latest objects. The number of objects it returns is defined by a NUM_LATEST setting. This has the potential to make my tests fail if someone were to change the setting. How can I override the settings on `setUp()` and subsequently restore them on `tearDown()`? If that isn't possible, is there some way I can monkey patch the method or mock the settings? EDIT: Here is my manager code: ``` class LatestManager(models.Manager): """ Returns a specific number of the most recent public Articles as defined by the NEWS_LATEST_MAX setting. """ def get_query_set(self): num_latest = getattr(settings, 'NEWS_NUM_LATEST', 10) return super(LatestManager, self).get_query_set().filter(is_public=True)[:num_latest] ``` The manager uses `settings.NEWS_LATEST_MAX` to slice the queryset. The `getattr()` is simply used to provide a default should the setting not exist.