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
This commit is contained in:
Russell Keith-Magee 2010-10-09 04:50:47 +00:00
parent 816c7d1e64
commit b7a73cf929
3 changed files with 41 additions and 1 deletions

View File

@ -210,6 +210,10 @@ class DocTestRunner(doctest.DocTestRunner):
transaction.rollback_unless_managed(using=conn) transaction.rollback_unless_managed(using=conn)
class TransactionTestCase(unittest.TestCase): 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): def _pre_setup(self):
"""Performs any pre-test setup. This includes: """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 set up. This means that user-defined Test Cases aren't required to
include a call to super().setUp(). include a call to super().setUp().
""" """
self.client = Client() self.client = self.client_class()
try: try:
self._pre_setup() self._pre_setup()
except (KeyboardInterrupt, SystemExit): except (KeyboardInterrupt, SystemExit):

View File

@ -1086,6 +1086,30 @@ This means, instead of instantiating a ``Client`` in each test::
response = self.client.get('/customer/index/') response = self.client.get('/customer/index/')
self.failUnlessEqual(response.status_code, 200) 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: .. _topics-testing-fixtures:
Fixture loading Fixture loading

View File

@ -457,3 +457,15 @@ class CSRFEnabledClientTests(TestCase):
# The CSRF-enabled client rejects it # The CSRF-enabled client rejects it
response = csrf_client.post('/test_client/post_view/', {}) response = csrf_client.post('/test_client/post_view/', {})
self.assertEqual(response.status_code, 403) 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)