djangoでテスト時にsettings.pyの内容を変更する

テストのためにsettings.pyの値を変えたい場合ってありますね。
テスト起動時に--settingsオプションでテスト用の別ファイルを指定する方法もありますが、他にも方法が用意されています。


Testing Django applications | Django documentation | Django


view関数でsettingsの内容を読みだしてcontextに設定するだけのサンプルです。

# settings.py
SAMPLE_SETTING = 'HELLO'

# views.py
class SimpleSettingOverrideView(TemplateView):
    template_name = 'apps/override.html'

    def get_context_data(self, **kwargs):
        ctx = super(SimpleSettingOverrideView, self).get_context_data(**kwargs)
        ctx.update({'sample_setting': settings.SAMPLE_SETTING})
        return ctx

# urls.py
url(r'^simple_override/?$', SimpleSettingOverrideView.as_view(), name='simple_override'),

テスト

class SimpleOverrideTest(TestCase):

    def test_not_override(self):
        client = Client()
        res = client.get(reverse('simple_override'))
        self.assertEquals(res.context_data['sample_setting'], 'HELLO')

    @override_settings(SAMPLE_SETTING='OVERRIDE')
    def test_override_settings(self):
        client = Client()
        res = client.get(reverse('simple_override'))
        self.assertEquals(res.context_data['sample_setting'], 'OVERRIDE')

    def test_override_context(self):
        client = Client()
        with self.settings(SAMPLE_SETTING='CONTEXT_OVERRIDE'):
            res = client.get(reverse('simple_override'))
            self.assertEquals(res.context_data['sample_setting'], 'CONTEXT_OVERRIDE')


ちゃんと上書きされてます。