Django @override_settings does not allow dictionary?
You should override the whole dict:
@override_settings(SETTING_DICT={'key': True})
def test_something(self):
...
Or, you can use override_settings
as a context manager:
def test_something(self):
value = settings.SETTING_DICT
value['key'] = True
with override_settings(SETTING_DICT=value):
...
Since Python 3.3, you may use collections.Chainmap
if you wand to override specific values in the dict (or other mapping) object using decorator and keep code clean from context manager.
https://docs.python.org/3/library/collections.html#collections.ChainMap
from collections import ChainMap
@override_settings(SETTING_DICT=ChainMap({'key': 'value'}, settings.SETTING_DICT))
def test_something(self):
...
The above will not override whole dict, and all other values in SETTINGS_DICT
will be available.
For Python 2.7 you may use backport, which contains Chainmap
implementation.
https://pypi.org/project/chainmap/
I didn't want to override the whole dict either, so I copied the dictionary in question from the settings
object and just modified the attribute I was interested in:
import copy
from django.conf import settings
settings_dict = copy.deepcopy(settings.SETTINGS_DICT)
settings_dict['key1']['key2'] = 'new value'
@override_settings(SETTINGS_DICT=settings_dict)
def test_something(self):
pass
It suits my purposes, but if you wanted to make this more widely usable, you could write a short function with a few arguments which could do something like this dynamically.
Note: I tried using settings.SETTINGS_DICT.copy()
instead of copy.deepcopy(settings.SETTINGS_DICT)
but that seemed to globally override the setting for all tests.