2012-08-02 5 views
1

Avec deux modèles:Django: réutilisation des tests unitaires dans d'autres tests unitaires

class Model1(models.Model): 
    attribute = models.CharField(max_length=100) 

class Model2(models.Model): 
    target = models.ForeignKey(Model1) 

Et unittest tests.py:

class Model1Test(TestCase): 
    def test_make_new_model_and_save(): 
     m = Model1() 
     m.attribute = 'test values' 
     m.save() 

class Model2Test(TestCase): 
    def test_make_new_model_and_save(): 
     # Make new Model1 to FK to 
     m = Model1() 
     m.attribute = 'test values' 
     m.save() 

     m2 = Model2() 
     m2.target = m 
     m2.save() 

Je voudrais simplement appeler la fonction unittest définie dans la classe de test de Model1, plutôt que de dupliquer à nouveau le code pour tester Model2. Ce que j'imagine comme:

class Model1Test(TestCase): 
    def test_make_new_model_and_save(): 
     m = Model1() 
     m.attribute = 'test values' 
     m.save() 
     return m 

class Model2Test(TestCase): 
    def test_make_new_model_and_save(): 
     # Make new Model1 to FK to 
     m = Model1Test('test_make_new_model_and_save') 

     m2 = Model2() 
     m2.target = m 
     m2.save() 

Mais cela ne semble pas fonctionner et je me retrouve immédiatement dans les entrailles du cadre de tests unitaires. Je ne trouve pas beaucoup de références à ce genre de choses, alors étant nouveau pour les tests unitaires, j'ai l'impression d'avoir fait un mauvais virage quelque part.

Existe-t-il une méthode «normale» de réutilisation des tests unitaires, ou mon approche est-elle faussée?

Répondre

2

Ceci est vraiment juste une question sur les objets et les classes en Python. La réponse est de définir une super-classe commune qui contient le code d'initialisation souhaité, hériter à la fois de Model1Test et de Model2Test, et l'appeler des deux.

class CommonSetUp(TestCase): 
    def make_new_model_and_save(): 
     m = Model1() 
     m.attribute = 'test values' 
     m.save() 
     return m 

class Model2Test(CommonSetUp): 
    def test_make_new_model_and_save(): 
     self.make_new_model_and_save() 
     self.assertTrue(...your assertions here...) 

class Model2Test(CommonSetUp): 
    def test_make_new_model_and_save(): 
     self.make_new_model_and_save() 

     m2 = Model2() 
     m2.target = m 
     m2.save() 

     self.assertTrue(...your assertions here...) 
0

Je ne recommande pas d'appeler la méthode de test dans une autre méthode de test.
Il fait du désordre et après un certain temps, les tests deviennent instables et plus difficiles à réparer ou à maintenir.