我有一个使用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。
我应该如何处理这个以便我可以使用这两个包?
答案 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)。