diff --git a/reviewboard/accounts/tests.py b/reviewboard/accounts/tests.py
index a348fc815ed1109a7433bb15f5cd0bf6ba63011b..6cee3424a5b257cd5b242b5b4b5aa978ea61890b 100644
--- a/reviewboard/accounts/tests.py
+++ b/reviewboard/accounts/tests.py
@@ -46,7 +46,6 @@ from reviewboard.accounts.pages import (AccountPage,
                                         get_page_classes,
                                         register_account_page_class,
                                         unregister_account_page_class)
-from reviewboard.extensions.tests import set_siteconfig_settings
 from reviewboard.site.models import LocalSite
 from reviewboard.site.urlresolvers import local_site_reverse
 from reviewboard.testing import TestCase
@@ -1089,7 +1088,7 @@ class AccountSettingsFormTests(TestCase):
 
         settings = {'diffviewer_syntax_highlighting': False}
 
-        with set_siteconfig_settings(settings):
+        with self.siteconfig_settings(settings):
             form = AccountSettingsForm(page, request, user, data={
                 'syntax_highlighting': False,
                 'timezone': profile.timezone,
diff --git a/reviewboard/extensions/tests.py b/reviewboard/extensions/tests.py
index 67b00b7975759103b1fb2c444e7e45380acd237e..5c6b8e4da07632baf11cea8123d6399be4f2ce84 100644
--- a/reviewboard/extensions/tests.py
+++ b/reviewboard/extensions/tests.py
@@ -66,35 +66,6 @@ from reviewboard.webapi.tests.mimetypes import root_item_mimetype
 from reviewboard.webapi.tests.urls import get_root_url
 
 
-@contextmanager
-def set_siteconfig_settings(settings):
-    """A context manager to toggle site configuration settings.
-
-    Args:
-        settings (dict):
-            The new site configuration settings.
-    """
-    siteconfig = SiteConfiguration.objects.get_current()
-
-    old_settings = {}
-
-    for setting, value in six.iteritems(settings):
-        old_settings[setting] = siteconfig.get(setting)
-        siteconfig.set(setting, value)
-
-    siteconfig.save()
-    load_site_config()
-
-    try:
-        yield
-    finally:
-        for setting, value in six.iteritems(old_settings):
-            siteconfig.set(setting, value)
-
-        siteconfig.save()
-        load_site_config()
-
-
 class ExtensionManagerMixin(object):
     """Mixin used to setup a default ExtensionManager for tests."""
 
@@ -1603,7 +1574,7 @@ class EmailHookTests(ExtensionManagerMixin, SpyAgency, TestCase):
             'review_request': review_request,
         }
 
-        with set_siteconfig_settings({'mail_send_review_mail': True}):
+        with self.siteconfig_settings({'mail_send_review_mail': True}):
             review_request.publish(admin)
 
         self.assertEqual(len(mail.outbox), 1)
@@ -1641,7 +1612,7 @@ class EmailHookTests(ExtensionManagerMixin, SpyAgency, TestCase):
             'to_owner_only': False,
         }
 
-        with set_siteconfig_settings({'mail_send_review_mail': True}):
+        with self.siteconfig_settings({'mail_send_review_mail': True}):
             review.publish(admin)
 
         self.assertEqual(len(mail.outbox), 1)
@@ -1680,7 +1651,7 @@ class EmailHookTests(ExtensionManagerMixin, SpyAgency, TestCase):
             'reply': reply,
         }
 
-        with set_siteconfig_settings({'mail_send_review_mail': True}):
+        with self.siteconfig_settings({'mail_send_review_mail': True}):
             reply.publish(admin)
 
         self.assertEqual(len(mail.outbox), 1)
@@ -1714,7 +1685,7 @@ class EmailHookTests(ExtensionManagerMixin, SpyAgency, TestCase):
             'close_type': ReviewRequest.SUBMITTED,
         }
 
-        with set_siteconfig_settings({'mail_send_review_close_mail': True}):
+        with self.siteconfig_settings({'mail_send_review_close_mail': True}):
             review_request.close(ReviewRequest.SUBMITTED, admin)
 
         self.assertEqual(len(mail.outbox), 1)
@@ -1748,7 +1719,7 @@ class EmailHookTests(ExtensionManagerMixin, SpyAgency, TestCase):
             'close_type': ReviewRequest.DISCARDED,
         }
 
-        with set_siteconfig_settings({'mail_send_review_close_mail': True}):
+        with self.siteconfig_settings({'mail_send_review_close_mail': True}):
             review_request.close(ReviewRequest.DISCARDED, admin)
 
         self.assertEqual(len(mail.outbox), 1)
@@ -1781,7 +1752,7 @@ class EmailHookTests(ExtensionManagerMixin, SpyAgency, TestCase):
             'mail_send_review_close_mail': True,
         }
 
-        with set_siteconfig_settings(siteconfig_settings):
+        with self.siteconfig_settings(siteconfig_settings):
             self.assertEqual(len(mail.outbox), 0)
 
             review.publish()
diff --git a/reviewboard/testing/testcase.py b/reviewboard/testing/testcase.py
index 8fdf5796f775595be277b41fc47791930a98982f..c41c86faacd7388073ada250322bb6e656a12570 100644
--- a/reviewboard/testing/testcase.py
+++ b/reviewboard/testing/testcase.py
@@ -18,6 +18,7 @@ from oauth2_provider.models import AccessToken
 
 from reviewboard import scmtools, initialize
 from reviewboard.accounts.models import ReviewRequestVisit
+from reviewboard.admin.siteconfig import load_site_config
 from reviewboard.attachments.models import FileAttachment
 from reviewboard.diffviewer.differ import DiffCompatVersion
 from reviewboard.diffviewer.models import DiffSet, DiffSetHistory, FileDiff
@@ -1332,3 +1333,29 @@ class TestCase(FixturesCompilerMixin, DjbletsTestCase):
             scope=scope,
             user=user,
         )
+
+    @contextmanager
+    def siteconfig_settings(self, settings, reload_settings=True):
+        """Temporarily sets siteconfig settings for a test.
+
+        Args:
+            settings (dict):
+                The new siteconfig settings to set.
+
+            reload_settings (bool, optional):
+                Whether to reload and recompute all settings, applying them
+                to Django and other objects.
+
+        Context:
+            The current site configuration will contain the new settings for
+            this test.
+        """
+        try:
+            with super(TestCase, self).siteconfig_settings(settings):
+                if reload_settings:
+                    load_site_config()
+
+                yield
+        finally:
+            if reload_settings:
+                load_site_config()
