यहाँ मेरे परीक्षण बेस क्लास का एक अंश है जो apply_async
विधि को स्टब्स करता है और कॉल को रिकॉर्ड करता है (जिसमें शामिल हैं Task.delay
।) यह थोड़ा सकल है, लेकिन यह पिछले कुछ महीनों से मेरी ज़रूरतों को पूरा करने में कामयाब रहा है जो मैं इसका उपयोग कर रहा हूं।
from django.test import TestCase
from celery.task.base import Task
class CeleryTestCaseBase(TestCase):
def setUp(self):
super(CeleryTestCaseBase, self).setUp()
self.applied_tasks = []
self.task_apply_async_orig = Task.apply_async
@classmethod
def new_apply_async(task_class, args=None, kwargs=None, **options):
self.handle_apply_async(task_class, args, kwargs, **options)
Task.apply_async = new_apply_async
def tearDown(self):
super(CeleryTestCaseBase, self).tearDown()
Task.apply_async = self.task_apply_async_orig
def handle_apply_async(self, task_class, args=None, kwargs=None, **options):
self.applied_tasks.append((task_class, tuple(args), kwargs))
def assert_task_sent(self, task_class, *args, **kwargs):
was_sent = any(task_class == task[0] and args == task[1] and kwargs == task[2]
for task in self.applied_tasks)
self.assertTrue(was_sent, 'Task not called w/class %s and args %s' % (task_class, args))
def assert_task_not_sent(self, task_class):
was_sent = any(task_class == task[0] for task in self.applied_tasks)
self.assertFalse(was_sent, 'Task was not expected to be called, but was. Applied tasks: %s' % self.applied_tasks)
यहाँ एक "सिर के ऊपर से" उदाहरण है कि आप इसे अपने परीक्षण मामलों में कैसे उपयोग करेंगे:
mymodule.py
from my_tasks import SomeTask
def run_some_task(should_run):
if should_run:
SomeTask.delay(1, some_kwarg=2)
test_mymodule.py
class RunSomeTaskTest(CeleryTestCaseBase):
def test_should_run(self):
run_some_task(should_run=True)
self.assert_task_sent(SomeTask, 1, some_kwarg=2)
def test_should_not_run(self):
run_some_task(should_run=False)
self.assert_task_not_sent(SomeTask)
CELERY_ALWAYS_EAGER
है कोई फर्क नहीं पड़ता?