diff --git a/django/test/testcases.py b/django/test/testcases.py index 10bd6c6c9f..58c26c8b71 100644 --- a/django/test/testcases.py +++ b/django/test/testcases.py @@ -210,6 +210,10 @@ class DocTestRunner(doctest.DocTestRunner): transaction.rollback_unless_managed(using=conn) class TransactionTestCase(unittest.TestCase): + # The class we'll use for the test client self.client. + # Can be overridden in derived classes. + client_class = Client + def _pre_setup(self): """Performs any pre-test setup. This includes: @@ -251,7 +255,7 @@ class TransactionTestCase(unittest.TestCase): set up. This means that user-defined Test Cases aren't required to include a call to super().setUp(). """ - self.client = Client() + self.client = self.client_class() try: self._pre_setup() except (KeyboardInterrupt, SystemExit): diff --git a/docs/topics/testing.txt b/docs/topics/testing.txt index 28e67b438c..28411ab05f 100644 --- a/docs/topics/testing.txt +++ b/docs/topics/testing.txt @@ -1086,6 +1086,30 @@ This means, instead of instantiating a ``Client`` in each test:: response = self.client.get('/customer/index/') self.failUnlessEqual(response.status_code, 200) +Customizing the test client +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. versionadded:: 1.3 + +.. attribute:: TestCase.client_class + +If you want to use a different Client class (for example, a subclass +with customized behavior), you can use the +:attr:`~TestCase.client_class` class attribute to specify a custom +``Client`` class in your test case:: + + from django.test import TestCase + from django.test.client import Client + + class MyTestClient(Client): + # .. specialized methods for your environment .. + + class MyTest(TestCase): + client_class = MyTestClient + + def test_my_stuff(self): + # .. Here self.client is an instance of MyTestClient .. + .. _topics-testing-fixtures: Fixture loading diff --git a/tests/modeltests/test_client/models.py b/tests/modeltests/test_client/models.py index 30520082da..cd3269ee26 100644 --- a/tests/modeltests/test_client/models.py +++ b/tests/modeltests/test_client/models.py @@ -457,3 +457,15 @@ class CSRFEnabledClientTests(TestCase): # The CSRF-enabled client rejects it response = csrf_client.post('/test_client/post_view/', {}) self.assertEqual(response.status_code, 403) + + +class CustomTestClient(Client): + i_am_customized = "Yes" + +class CustomTestClientTest(TestCase): + client_class = CustomTestClient + + def test_custom_test_client(self): + """A test case can specify a custom class for self.client.""" + self.assertEqual(hasattr(self.client, "i_am_customized"), True) +