summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell Keith-Magee <russell@keith-magee.com>2010-10-09 04:50:47 +0000
committerRussell Keith-Magee <russell@keith-magee.com>2010-10-09 04:50:47 +0000
commitb7a73cf9296a2629a45d4b303c2b9207d3c71c40 (patch)
treef2d6d74b946695c98a5f078146a4711ef2e301dc
parent816c7d1e644f72563ee4a86582bb98ea3b1922e4 (diff)
Fixed #14378 -- Made the test client class customizable. Thanks to Ned Batchelder for the patch.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@14058 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/test/testcases.py6
-rw-r--r--docs/topics/testing.txt24
-rw-r--r--tests/modeltests/test_client/models.py12
3 files changed, 41 insertions, 1 deletions
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)
+