我在這裏看到3個選項。
1)嘗試在apply()上調用get()
。這裏是你會得到什麼:
class TestMe(unittest.TestCase):
def test_celery_task(self):
self.assertRaises(ValueError, celery_task.apply().get(), args)
2)您可以通過「task_always_eager」設置爲True
啓用eager模式,但它並不能保證你的代碼將能夠趕上。
3)更好的選擇是嘲笑芹菜任務。從單元測試的角度來看,用芹菜等系統中實際的「活着」部分來測試代碼單元並不是真實的。 這是一個取自芹菜testing documentation的代碼示例。
from pytest import raises
from celery.exceptions import Retry
# for python 2: use mock.patch from `pip install mock`.
from unittest.mock import patch
from proj.models import Product
from proj.tasks import send_order
class test_send_order:
@patch('proj.tasks.Product.order') # < patching Product in module above
def test_success(self, product_order):
product = Product.objects.create(
name='Foo',
)
send_order(product.pk, 3, Decimal(30.3))
product_order.assert_called_with(3, Decimal(30.3))
@patch('proj.tasks.Product.order')
@patch('proj.tasks.send_order.retry')
def test_failure(send_order_retry, product_order):
product = Product.objects.create(
name='Foo',
)
# set a side effect on the patched method
# so that it raises the error we want.
product_order.side_effect = OperationalError()
with raises(Retry):
send_order(product.pk, 3, Decimal(30.6))
這個芹菜任務會在本地運行還是會被添加到我的隊列中? – smart
本地運行,就是這一點。 –
coo,如果在本地。它看起來對我來說很有用。我有一個新的錯誤,如果它不是因爲意外執行芹菜任務,我會接受你的方法 – smart