2016-04-09 2 views
1

Les modèles en cours de test sontDjango: test optimize qui viole SECS

class A(models.Model): 
    """ model A""" 
    name = models.CharField(max_length=50, unique=True) 
    slug = AutoSlugField(max_length=265, unique=True, populate_from='name') 
    link = models.URLField(blank=True) 

    class Meta: 
     verbose_name = 'Model A' 

    def __unicode__(self): 
     return self.name 

class B(models.Model): 
    """ model B""" 
    name = models.CharField(max_length=50, unique=True) 
    slug = AutoSlugField(max_length=265, unique=True, populate_from='name') 
    link = models.URLField(blank=True) 

    class Meta: 
     verbose_name = 'Model B' 

    def __unicode__(self): 
     return self.name 

Les tests simples pour les modèles donnés,

class TestA(TestCase): 
    """ Test the A model """ 

    def setUp(self): 
     self.name = 'A' 
     self.slug = 'a' 
     self.object = A.objects.create(name=self.name) 

    def test_autoslug_generaton(self): 
     """ test automatically generated slug """ 
     assert self.object.slug == self.slug 

    def test_return_correct_name(self): 
     """ test the __unicode__() method """ 
     assert self.object.__unicode__() == self.name 

class TestB(TestCase): 
    """ Test the A model """ 

    def setUp(self): 
     self.name = 'B' 
     self.slug = 'b' 
     self.object = B.objects.create(name=self.name) 

    def test_autoslug_generaton(self): 
     """ test automatically generated slug """ 
     assert self.object.slug == self.slug 

    def test_return_correct_name(self): 
     """ test the __unicode__() method """ 
     assert self.object.__unicode__() == self.name 

Ici, les essais viole DRY que les tests ne sont que de dupliquer des modèles modifiés . comment refactoriser les tests car cela ne viole pas DRY?

SEC - DR Ontario EPEAT Y nous-même, une philosophie de développement logiciel qui vise à réduire la répétition de la redondance et le code.

Merci.

+0

Dupliquer de http: // stackoverflow.com/questions/4566910/abstract-test-case-using-python-unittest – rnevius

Répondre

2

Comme mentionné dans la réponse soulignée dans le commentaire de @mevius, l'héritage multiple est un chemin à parcourir. Créer un mixin pour les méthodes d'essai répétées, et juste mettre en œuvre setUp et tearDown dans les classes de test réelles:

class MixinAB(object): 

    def test_autoslug_generaton(self): 
     """ test automatically generated slug """ 
     assert self.object.code == self.slug 

    def test_return_correct_name(self): 
     """ test the __unicode__() method """ 
     assert self.object.__unicode__() == self.name 


class TestA(MixinAB, TestCase): 
    """ Test the A model """ 

    def setUp(self): 
     self.name = 'A' 
     self.slug = 'a' 
     self.object = A.objects.create(name=self.name) 
+0

test réussi. Merci beaucoup. – Deena

1

Le double suggéré et la réponse de schwobaseggl résoudre votre question de haut niveau, mais il y a peut-être une autre façon de le faire que je argumenter serait mieux pour DRY. Actuellement, vous avez deux modèles identiques à 99%. Je m'attends à ce que cela soit fait pour garder votre question centrée, mais en supposant qu'il y ait un chevauchement important dans vos «vrais» modèles, vous avez déjà échoué à ne pas vous répéter. Je suggère d'envisager de refactoriser A et B pour hériter d'un modèle de base (voir https://docs.djangoproject.com/es/1.9/topics/db/models/#abstract-base-classes). Vous pourriez alors avoir un test pour la fonctionnalité commune qui est refactorisée dans la base (qui pourrait utiliser des instances de A ou B), puis séparer les cas de test des parties uniques de A et B.

+0

merci. Je vais refactoriser les modèles, je n'ai jamais considéré hériter des modèles d'un modèle abstrait car les vrais modèles ne semblent pas identiques mais certains champs pour lesquels j'ai écrit des tests. depuis @schwobaseggl a répondu à la question J'accepte la réponse car la question est spécifiquement sur le test. – Deena