同时使用django-nose和django-celery - 单元测试

时间:2013-03-23 02:38:45

标签: django celery django-celery django-nose

我有一个使用django-nose的django项目。我想将django-celery添加到项目中。我使用单元测试。 django-nose和django-celery都需要在settings.py文件中设置TEST_RUNNER。具体做法是:

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'

对于django-nose和:

TEST_RUNNER = 'djcelery.contrib.test_runner.CeleryTestSuiteRunner'

对于django-celery。

我应该如何处理这个以便我可以使用这两个包?

3 个答案:

答案 0 :(得分:6)

我发现处理此问题的最佳方法是跳过Celery测试运行器。我只是使用@override_settings(CELERY_ALWAYS_EAGER=True)来装饰我的芹菜使用测试,一切都得到了很好的测试。

答案 1 :(得分:4)

如果您能够将测试分离为芹菜和非芹菜依赖功能,您可以在调用芹菜任务的测试类上尝试overriding settings

from django.test.utils import override_settings

@override_settings(TEST_RUNNER='djcelery.contrib.test_runner.CeleryTestSuiteRunner')
class AsyncTestCase(TestCase):
     def test_async(self):
         self.assertEquals(add.delay(4,4), 8)

而NoseTestRunner将设置为settings.py

中的默认值

答案 2 :(得分:2)

你可以继承Celery亚军和Nose亚军,然后你可以为所有人获得良好的支持。

from django_nose import NoseTestSuiteRunner
from djcelery.contrib.test_runner import CeleryTestSuiteRunner

class TestRunner(CeleryTestSuiteRunner, NoseTestSuiteRunner):
    pass

然后在您的设置中:

TEST_RUNNER = '<package to>.TestRunner'

为什么会这样:

help(TestRunner)

你得到:

|  Method resolution order:
|      TestRunner
|      djcelery.contrib.test_runner.CeleryTestSuiteRunner
|      django_nose.runner.NoseTestSuiteRunner
|      django_nose.runner.BasicNoseRunner
|      django_nose.runner.BaseRunner
|      django.test.runner.DiscoverRunner
|      builtins.object

测试CeleryTestRunner没有做任何设置配置,然后调用super().setup_test_environment()。那么super将在该链中寻找setup_test_environment()。

观看Raymond Hettinger的视频:超级考虑超级(here)。