Fixed #30457 -- Added TestCase.captureOnCommitCallbacks().

This commit is contained in:
Adam Johnson 2020-05-20 11:04:36 +01:00 committed by Mariusz Felisiak
parent ca6c5e5fc2
commit e906ff6fca
5 changed files with 137 additions and 4 deletions

View file

@ -881,6 +881,42 @@ It also provides an additional method:
previous versions of Django these objects were reused and changes made
to them were persisted between test methods.
.. classmethod:: TestCase.captureOnCommitCallbacks(using=DEFAULT_DB_ALIAS, execute=False)
.. versionadded:: 3.2
Returns a context manager that captures :func:`transaction.on_commit()
<django.db.transaction.on_commit>` callbacks for the given database
connection. It returns a list that contains, on exit of the context, the
captured callback functions. From this list you can make assertions on the
callbacks or call them to invoke their side effects, emulating a commit.
``using`` is the alias of the database connection to capture callbacks for.
If ``execute`` is ``True``, all the callbacks will be called as the context
manager exits, if no exception occurred. This emulates a commit after the
wrapped block of code.
For example::
from django.core import mail
from django.test import TestCase
class ContactTests(TestCase):
def test_post(self):
with self.captureOnCommitCallbacks(execute=True) as callbacks:
response = self.client.post(
'/contact/',
{'message': 'I like your site'},
)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(callbacks), 1)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].subject, 'Contact Form')
self.assertEqual(mail.outbox[0].body, 'I like your site')
.. _live-test-server:
``LiveServerTestCase``