133 votes

Comment tester à l'unité avec différents paramètres dans Django?

Est-il un simple mécanisme de remplacement des Django paramètres d'un test unitaire? J'ai un manager sur un de mes modèles qui renvoie un nombre précis de la dernière objets. Le nombre d'objets qu'elle renvoie est défini par un NUM_LATEST réglage.

Cela a le potentiel pour faire mes tests échouent si quelqu'un venait à changer le réglage. Comment puis-je remplacer les paramètres sur setUp() et par la suite de les restaurer sur tearDown()? Si ce n'est pas possible, est-il une manière que je peux monkey patch de la méthode ou de se moquer de l'paramètres?

EDIT: Voici mon code gestionnaire:

class LatestManager(models.Manager):
    """
    Returns a specific number of the most recent public Articles as defined by 
    the NEWS_LATEST_MAX setting.
    """
    def get_query_set(self):
    	num_latest = getattr(settings, 'NEWS_NUM_LATEST', 10)
    	return super(LatestManager, self).get_query_set().filter(is_public=True)[:num_latest]

Le gestionnaire utilise settings.NEWS_LATEST_MAX pour la tranche du queryset. L' getattr() est simplement utilisé pour fournir une valeur par défaut si le paramètre n'existe pas.

176voto

slinkp Points 1154

Depuis Django 1.4, il existe des moyens de remplacer les paramètres pendant les tests: https://docs.djangoproject.com/fr/1.6/topics/testing/tools/#overriding-settings

TestCase aura un gestionnaire de contexte self.settings et un décorateur @override_settings pouvant être appliqué à une méthode de test ou à une sous-classe entière de TestCase.

Ces fonctionnalités n'existaient pas encore dans Django 1.3.

48voto

Jarret Hardie Points 36266

Vous pouvez faire ce que vous voulez dans la sous-classe UnitTest , y compris la définition et la lecture des propriétés d'instance:

 from django.conf import settings

class MyTest(unittest.TestCase):
   def setUp(self):
       self.old_setting = settings.NUM_LATEST
       settings.NUM_LATEST = 5 # value tested against in the TestCase

   def tearDown(self):
       settings.NUM_LATEST = self.old_setting
 

Étant donné que les cas de test django fonctionnent avec une seule unité d'exécution, je suis curieux de savoir quoi d'autre pourrait modifier la valeur NUM_LATEST. Si ce "autre chose" est déclenché par votre routine de test, je ne suis pas sûr qu'une quelconque correction de singe sauvera le test sans invalider la véracité des tests eux-mêmes.

20voto

akaihola Points 10007

Mise à jour : la solution ci-dessous n'est nécessaire que sur Django 1.3.x et les versions antérieures. Pour> 1.4, voir la réponse de slinkp .

Si vous modifiez fréquemment les paramètres dans vos tests et utilisez Python ≥2.5, cette option est également pratique:

 from contextlib import contextmanager

class SettingDoesNotExist:
    pass

@contextmanager
def patch_settings(**kwargs):
    from django.conf import settings
    old_settings = []
    for key, new_value in kwargs.items():
        old_value = getattr(settings, key, SettingDoesNotExist)
        old_settings.append((key, old_value))
        setattr(settings, key, new_value)
    yield
    for key, old_value in old_settings:
        if old_value is SettingDoesNotExist:
            delattr(settings, key)
        else:
            setattr(settings, key, old_value)
 

Ensuite, vous pouvez faire:

 with patch_settings(MY_SETTING='my value', OTHER_SETTING='other value'):
    do_my_tests()
 

3voto

Jiaaro Points 14379

Vous avez trouvé ceci en essayant de corriger certains doctests ... Pour être complet, je tiens à mentionner que si vous envisagez de modifier les paramètres lors de l'utilisation de doctests, vous devez le faire avant d'importer quoi que ce soit d'autre ...

 >>> from django.conf import settings

>>> settings.SOME_SETTING = 20

>>> # Your other imports
>>> from django.core.paginator import Paginator
>>> # etc
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X