9

我有一个使用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 芹菜。

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

4

3 回答 3

6

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

于 2013-05-06T18:42:41.670 回答
4

如果您能够将测试隔离为 celery 和非 celery 依赖的功能,您可以尝试覆盖调用 celery 任务的测试类的设置:

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 中设置为默认值

于 2013-04-15T01:48:53.540 回答
2

您可以将 Celery runner 和 Nose runner 子类化,然后您将获得所有这些方面的好处。

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(). 然后超级将在该链中寻找 setup_test_environment() 。

观看 Raymond Hettinger 的视频:超级被认为是超级(这里)。

于 2015-12-15T06:46:13.730 回答