2013-03-23 12 views
8

Ho un progetto Django che utilizzava django-nose. Vorrei aggiungere django-celery al progetto. Io uso i test unitari. Sia django-nose che django-sedano hanno bisogno di un'impostazione TEST_RUNNER nel mio file settings.py. In particolare:Utilizzo di django-nose e django-sedano insieme - unit test

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner' 

per django-naso e:

TEST_RUNNER = 'djcelery.contrib.test_runner.CeleryTestSuiteRunner' 

per django-sedano.

Come devo gestirlo in modo da poter utilizzare entrambi i pacchetti?

+0

+1 idk, forse deve sottoclasse uno e aggiunge la funzionalità dell'altro alla tua classe. –

risposta

6

Ho trovato che il modo migliore per gestire questo è saltare il corridore test di Celery. Io uso solo decorare i miei test con il sedano con uno @override_settings(CELERY_ALWAYS_EAGER=True) e tutto viene testato bene.

4

Se siete in grado di isolare i test in sedano e non sedano funzionalità dipendente, si potrebbe provare overriding settings sulle classi di test che richiamano le attività di sedano:

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) 

mentre il NoseTestRunner verrebbe impostato come default in settings.py

+0

Grazie - esaminerò questo approccio. – Erik

1

Puoi sottoclasse corridore di sedici e corridore di naso, quindi ottieni lati positivi per tutti loro.

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

class TestRunner(CeleryTestSuiteRunner, NoseTestSuiteRunner): 
    pass 

Poi nelle impostazioni:

TEST_RUNNER = '<package to>.TestRunner' 

Perché funziona:

help(TestRunner) 

si ottiene:

| 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 

Il CeleryTestRunner di prova non ha fatto nulla solo impostando alcuni config e quindi chiama super().setup_test_environment(). Quindi il super cercherà setup_test_environment() in quella catena.

Guarda il video di Raymond Hettinger: super considerato super (here).