2013-03-23 68 views
8

我有一個django項目,使用django-nose。我想爲項目添加django-celery。我使用單元測試。在我的settings.py文件中,django-nose和django-celery都需要TEST_RUNNER設置。具體做法是:一起使用django-nose和django-芹菜 - 單元測試

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner' 

爲django的鼻子和:

TEST_RUNNER = 'djcelery.contrib.test_runner.CeleryTestSuiteRunner' 

爲Django的芹菜。

我該如何處理這個問題,以便我可以使用這兩個包?

+0

+1 idk,可能必須將子類繼承並將其他類的功能添加到自己的類中。 – 2013-04-03 21:24:58

回答

6

我發現處理這個問題的最好方法是跳過Celery測試跑步者。我只是用@override_settings(CELERY_ALWAYS_EAGER=True)裝飾我的芹菜使用測試,一切都很好地測試。

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

+0

謝謝 - 我會研究這種方法。 – Erik 2013-04-15 20:25:15

1

你可以繼承芹菜賽跑者和鼻子亞軍,然後你會得到好的一面。

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的視頻:super super super(here)。