Comment l'Unité de test avec des paramètres différents 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
à couper le queryset. Le getattr()
est simplement utilisé pour fournir une valeur par défaut si le paramètre n'existe pas.
- pouvez-vous expliquer pourquoi ou de fournir une meilleure réponse?
- Il a changé dans l'intervalle; l'ancien accepté un a celui-ci 😉
Vous devez vous connecter pour publier un commentaire.
EDIT: Cette réponse s'applique si vous voulez changer les paramètres d'un petit nombre de spécifiques tests.
Depuis Django 1.4, il existe des moyens pour remplacer les paramètres pendant les essais:
https://docs.djangoproject.com/en/dev/topics/testing/tools/#overriding-settings
Cas de test auto.paramètres du gestionnaire de contexte, et il y aura aussi un @override_settings décorateur qui peut être appliqué à une méthode de test ou d'un ensemble de cas de test sous-classe.
Ces caractéristiques n'existent pas encore dans Django 1.3.
Si vous souhaitez modifier les paramètres tous vos tests, vous aurez envie de créer un fichier de paramètres pour le test, qui permet de charger et remplacer les paramètres de votre principal fichier de paramètres. Il y a plusieurs approches dans les autres réponses, j'ai vu des succès des variations sur les deux hspander de l' et dmitrii de l' approches.
self.settings().wrapped.MEDIA_ROOT
, mais c'est assez terrible.@modify_settings(MIDDLEWARE_CLASSES=...
(merci pour cette réponse)Vous pouvez faire ce que vous voulez à la
UnitTest
sous-classe, y compris l'établissement et la lecture des propriétés d'une instance:Depuis le django des cas de test à exécuter single-threaded, cependant, je suis curieux de savoir ce que l'autre personne peut être en modifiant le NUM_LATEST valeur? Si cette "autre chose" est déclenchée par votre routine de test, alors je ne suis pas sûr de tout montant de monkey patching permettra d'économiser de l'essai sans invalider la véracité des tests de lui-même.
settings.TEMPLATE_LOADERS
... Donc ce n'est pas façon générale, au moins, les paramètres ou Django n'est pas rechargé ou rien avec ce truc.USE_TZ
🙁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 slinkp réponse.
Si vous modifiez les paramètres fréquemment dans vos tests et l'utilisation de Python ≥2.5, c'est également à portée de main:
Alors vous pouvez faire:
yield
déclaration, avec la dernière partie de la fonction contenue dans lefinally
bloc, de sorte que les paramètres sont toujours revenue.Vous pouvez passer
--settings
option lors de l'exécution de testsBien que primordial de configuration des paramètres de l'exécution peut aider, à mon avis, vous devez créer un fichier séparé pour les tests. Cela permet d'économiser beaucoup de la configuration pour le test et cela permettrait de s'assurer que vous ne jamais faire quelque chose d'irréversible (comme le nettoyage de base de données intermédiaire).
Dire que votre test de fichier existe dans 'my_project/test_settings.py', ajouter
dans votre manage.py. Cela permettra d'assurer que lorsque vous exécutez
python manage.py test
vous utilisez test_settings seulement. Si vous êtes en utilisant un autre essai de client comme pytest, vous pouvez aussi facilement ajouter à pytest.ini@override_settings
est idéal si vous n'avez pas beaucoup de différences entre votre production et l'environnement de test configurations.Dans d'autres cas, vous feriez mieux de juste avoir des paramètres différents fichiers. Dans ce cas, votre projet doit ressembler à cela:
De sorte que vous devez avoir votre la plupart de vos paramètres de
base.py
puis dans d'autres fichiers dont vous avez besoin pour importer tous les tout à partir de là, et de modifier certaines options. Voici ce que votretest.py
fichier ressemblera à:Et ensuite, soit vous devez spécifier
--settings
option comme dans @MicroPyramid de réponse, ou de spécifierDJANGO_SETTINGS_MODULE
variable d'environnement, puis vous pouvez exécuter vos tests:Trouvé cela tout en essayant de résoudre certains doctests... Pour être complet, je tiens à mentionner que si vous allez modifier les paramètres lors de l'utilisation de doctests, vous devez le faire avant d'importer autre chose...
Je suis en utilisant pytest.
J'ai réussi à résoudre ce la façon suivante: