Dưới đây là một đoạn trích từ lớp cơ sở thử nghiệm của tôi để khai báo phương pháp apply_async
và ghi lại các cuộc gọi đến nó (bao gồm Task.delay
.) Đó là một chút, nhưng nó được quản lý để phù hợp với nhu cầu của tôi trong vài tháng qua ' đã sử dụng nó.
from django.test import TestCase
from celery.task.base import Task
# For recent versions, Task has been moved to celery.task.app:
# from celery.app.task import Task
# See http://docs.celeryproject.org/en/latest/reference/celery.app.task.html
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)
# monkey patch the regular apply_sync with our method
Task.apply_async = new_apply_async
def tearDown(self):
super(CeleryTestCaseBase, self).tearDown()
# Reset the monkey patch to the original method
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)
Dưới đây là một "ra khỏi đỉnh đầu" dụ về cách bạn sẽ sử dụng nó trong trường hợp thử nghiệm của bạn:
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)
những gì bạn có nghĩa là 'CELERY_ALWAYS_EAGER' làm cho không có sự khác biệt? – asksol
Tôi vẫn gặp lỗi về việc không thể liên hệ với rabbitmq. –
Bạn có chuyến đi không? Tôi đoán một cái gì đó khác hơn '.delay' có thể cố gắng thiết lập một kết nối. – asksol