| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 | ================ Unit Testing================Testing with Django-------------------The problem that you'll first run in to when trying to write a test that runs atask is that Django's test runner doesn't use the same database that your celerydaemon is using. If you're using the database backend, this means that yourtombstones won't show up in your test database and you won't be able to checkon your tasks to get the return value or check the status.There are two ways to get around this. You can either take advantage of``CELERY_ALWAYS_EAGER = True`` to skip the daemon, or you can avoid testinganything that needs to check the status or result of a task.Using a custom test runner to test with celery----------------------------------------------If you're going the ``CELERY_ALWAYS_EAGER`` route, which is probably better thanjust never testing some parts of your app, a custom Django test runner does thetrick. Celery provides a simple test runner, but it's easy enough to roll yourown if you have other things that need to be done.http://docs.djangoproject.com/en/dev/topics/testing/#defining-a-test-runnerFor this example, we'll use the ``celery.contrib.test_runner`` to test the``add`` task from the :doc:`User Guide: Tasks<../userguide/tasks>` examples.To enable the test runner, set the following settings:.. code-block:: python    TEST_RUNNER = 'celery.contrib.test_runner.run_tests'Then we can write our actually test in a ``tests.py`` somewhere:.. code-block:: python    from django.test import TestCase    from myapp.tasks import add    class AddTestCase(TestCase):        def testNoError(self):            """Test that the ``add`` task runs with no errors,            and returns the correct result."""            result = add.delay(8, 8)            self.assertEquals(result.get(), 16)            self.assertTrue(result.successful())This test assumes that you put your example ``add`` task in ``maypp.tasks``so of course adjust the import for wherever you actually put the class.
 |