From 2545dc59bf44131a1f60f7393f29f025939f3a09 Mon Sep 17 00:00:00 2001 From: Tim Graham Date: Tue, 18 Dec 2012 06:39:23 -0500 Subject: [PATCH] [1.5.x] Fixed #17312 - Warned about database side effects in tests. Thanks jcspray for the suggestion. Backport of 7df03268a467a9aec9c4c574c85317a738ca33ae from master. --- docs/topics/testing.txt | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/docs/topics/testing.txt b/docs/topics/testing.txt index cbef07bcedb..954f7bd644a 100644 --- a/docs/topics/testing.txt +++ b/docs/topics/testing.txt @@ -115,8 +115,8 @@ Here is an example :class:`unittest.TestCase` subclass:: class AnimalTestCase(unittest.TestCase): def setUp(self): - self.lion = Animal.objects.create(name="lion", sound="roar") - self.cat = Animal.objects.create(name="cat", sound="meow") + self.lion = Animal(name="lion", sound="roar") + self.cat = Animal(name="cat", sound="meow") def test_animals_can_speak(self): """Animals that can speak are correctly identified""" @@ -139,6 +139,18 @@ For more details about :mod:`unittest`, see the Python documentation. .. _suggested organization: http://docs.python.org/library/unittest.html#organizing-tests +.. warning:: + + If your tests rely on database access such as creating or querying models, + be sure to create your test classes as subclasses of + :class:`django.test.TestCase` rather than :class:`unittest.TestCase`. + + In the example above, we instantiate some models but do not save them to + the database. Using :class:`unittest.TestCase` avoids the cost of running + each test in a transaction and flushing the database, but for most + applications the scope of tests you will be able to write this way will + be fairly limited, so it's easiest to use :class:`django.test.TestCase`. + Writing doctests ---------------- @@ -343,7 +355,7 @@ This convenience method sets up the test database, and puts other Django features into modes that allow for repeatable testing. The call to :meth:`~django.test.utils.setup_test_environment` is made -automatically as part of the setup of `./manage.py test`. You only +automatically as part of the setup of ``./manage.py test``. You only need to manually invoke this method if you're not using running your tests via Django's test runner. @@ -1382,6 +1394,7 @@ attribute:: def test_my_stuff(self): # Here self.client is an instance of MyTestClient... + call_some_test_code() .. _topics-testing-fixtures: