[1.5.x] Fixed #20316 - Clarified transaction behavior of TestCase.

Thanks uberj@ for the report and lolek09 for the patch.

Backport of dffdca1109 from master
This commit is contained in:
Tim Graham 2013-05-23 10:57:44 -04:00
parent 9ed2121eca
commit cd15a51c3e
1 changed files with 12 additions and 3 deletions

View File

@ -910,14 +910,23 @@ to test the effects of commit and rollback:
* A ``TestCase``, on the other hand, does not truncate tables after a test. * A ``TestCase``, on the other hand, does not truncate tables after a test.
Instead, it encloses the test code in a database transaction that is rolled Instead, it encloses the test code in a database transaction that is rolled
back at the end of the test. It also prevents the code under test from back at the end of the test. Both explicit commits like
issuing any commit or rollback operations on the database, to ensure that the ``transaction.commit()`` and implicit ones that may be caused by
rollback at the end of the test restores the database to its initial state. ``Model.save()`` are replaced with a ``nop`` operation. This guarantees that
the rollback at the end of the test restores the database to its initial
state.
When running on a database that does not support rollback (e.g. MySQL with the When running on a database that does not support rollback (e.g. MySQL with the
MyISAM storage engine), ``TestCase`` falls back to initializing the database MyISAM storage engine), ``TestCase`` falls back to initializing the database
by truncating tables and reloading initial data. by truncating tables and reloading initial data.
.. warning::
While ``commit`` and ``rollback`` operations still *appear* to work when
used in ``TestCase``, no actual commit or rollback will be performed by the
database. This can cause your tests to pass or fail unexpectedly. Always
use ``TransactionalTestCase`` when testing transactional behavior.
.. note:: .. note::
.. versionchanged:: 1.5 .. versionchanged:: 1.5