2009-08-24 4 views
3

J'ai une chose nécessaire comme ceci:Comment UnitTest délai d'attente de session dans Django

Dès que le signsup utilisateur (et sera dans l'état d'attente jusqu'à ce qu'il confirme son adresse e-mail), une variable de session est définie quelque chose comme "FIRST_TIME_FREE_SESSION_EXPIRY_AGE_KEY" (désolé si le nom semble confus!) qui sera défini sur un objet datetime ajoutant 8 heures à l'heure actuelle. Comment cela peut-il avoir un impact sur l'utilisateur, l'utilisateur a 8 heures de temps pour utiliser toutes les fonctionnalités de notre site, sans avoir à confirmer son adresse e-mail. Après 8 heures, chaque vue/page montrera une grande bannière indiquant à l'utilisateur de confirmer. (Toutes ces fonctionnalités sont obtenues en utilisant un seul décorateur "ensure_confirmed_user" pour chaque vue).

Je veux tester la même fonctionnalité en utilisant l'addon unittest de django (classe TestCase). Comment fait-on ça? Mise à jour: Dois-je mettre à jour manuellement la valeur de la variable de session mentionnée (modification de 8 heures à quelques secondes) de façon à ce que cela soit fait? Ou une meilleure façon est là?

Mise à jour: Cela peut sembler fou, mais je veux simuler une demande du futur.

+0

[freezegun] (https://pypi.python.org/pypi/freezegun/) nous allons vous manipuler le temps à volonté dans les tests. Le test qui en résultera sera également très explicite. –

Répondre

0

Je peux penser à un couple de possibilités. Au cours de votre test, remplacez la variable FIRST_TIME_FREE_SESSION_EXPIRY_AGE_KEY et définissez-la sur une limite de temps plus courte. Vous pouvez alors attendre que cette limite de temps soit écoulée et vérifier si la fonctionnalité fonctionne comme prévu.

remplacer alternativement vos propres fonctions datetime (en supposant que votre fonctionnalité repose sur datetime)

Vous pouvez accomplir ces setup_ en remplaçant et teardown_test_environment méthodes.

3

Généralement, si le test unitaire est difficile car le code du produit dépend de ressources externes qui ne coopèrent pas, vous pouvez extraire ces ressources et les remplacer par des variables factices qui font ce que vous voulez.

Dans ce cas, la ressource externe est l'heure. Au lieu d'utiliser datetime.now(), refactorisez le code pour accepter une fonction de temps externe. Il peut par défaut être datetime.now. Ensuite, dans vos tests unitaires, vous pouvez changer l'heure à mesure que le test progresse. Cela vaut mieux que de changer le délai d'attente de la session à quelques secondes, car même dans ce cas, vous devez dormir pendant quelques secondes dans le test pour obtenir l'effet que vous voulez. Les tests unitaires doivent être exécutés aussi rapidement que possible, afin qu'ils soient exécutés plus souvent.

0

Mes paramètres.py diffère légèrement selon que Django est exécuté dans un environnement de production ou dans un environnement de développement. J'ai 2 modules de paramètres: settings.py et settings_dev.py. La version de développement se présente comme suit:

from settings import * 

DEBUG = True 

INSTALLED_APPS = tuple(list(INSTALLED_APPS) + [ 
      'dev_app', 
      ]) 

Maintenant vous pouvez résoudre votre problème de différentes manières:

  1. ajouter la variable avec des valeurs différentes pour les deux modules de paramètres;
  2. Lorsque vous définissez la variable, choisissez entre deux valeurs en fonction de la valeur du paramètre DEBUG. Vous pouvez également utiliser DEBUG pour omettre le test unitaire sur le serveur de production, car le test prendra probablement trop de temps de toute façon.

Vous pouvez utiliser le module de réglages actif comme ceci:

from django.conf.project_template import settings 

if settings.DEBUG: 
    ... 
Questions connexes