2010-12-15 122 views
1

je faisais ce qui suit pour une définition de formulaire Django (gênant, oui):Python: Les tests unitaires pour la date change

class DealAdvancedSearchForm(forms.Form): 
    weekday_choices = [ 
     ['monday', 'Monday'], 
     ['tuesday', 'Tuesday'], 
     ['wednesday', 'Wednesday'], 
     ['thursday', 'Thursday'], 
     ['friday', 'Friday'], 
     ['saturday', 'Saturday'], 
     ['sunday', 'Sunday'], 
    ] 
    weekday_index = date.today().weekday() 
    weekday_choices[weekday_index][1] += ' (Today)' 
    weekday_choices[weekday_index+1][1] += ' (Tomorrow)' 
    weekday = forms.ChoiceField(label='Day of the week', choices=weekday_choices, required=False) 

Comme vous l'avez probablement deviné, cela fonctionne très bien tant que date.today() ne change pas . Tous mes tests ont réussi. Cependant, une fois la date changée, le choix de la date initiale est marqué de manière incorrecte comme marqué aujourd'hui.

J'ai depuis compris à quel point c'était stupide et j'ai déplacé le code dans la méthode __init__.

Maintenant, je veux écrire un test pour cela. Est-ce que quelqu'un sait comment je testerais que le jour de la semaine correct est marqué comme (Today) quand la date change?

Répondre

1

Index hors limites Erreur:

Watch out for [weekday_index+1] for 'sunday', 
use [(weekday_index+1)%7] to wrap down to 0. 

Extrait les choix dans une méthode pour le rendre facile à tester. Si la méthode ne contient que python et pas de django, il sera plus facile à tester et donc plus facile à comprendre. Je suis également d'accord que vous devez créer un __ init __, aujourd'hui aujourd'hui peut changer à la fin d'aujourd'hui et doit varier avec cela.

def weekday_choices(self, todays_index): 
    ... 
    return choices_list 

EDIT:

  • Actuellement, votre code fonctionne exactement une fois.
  • Déplacez la logique pour opérer sur une instance plutôt que sur la classe.
  • Utilisez une bibliothèque comme MiniMock pour simuler les réponses de date.today() .jour(). Date.today() devra renvoyer un fichier qui utilisera returns_iter
  • Instancié 2 formes et d'affirmer que leurs listes de choix sont comme prévu.
    • Un pour la date d'aujourd'hui, un pour demain.
  • Vous pouvez aussi vous moquer du test modulo.
+0

+1 pour la suggestion de module. Cependant, ce que je veux, c'est tester ce qui se passera si la date change. –

+0

@NimmyLebby, j'ai ajouté quelques infos sur MiniMock. Un outil très utile pour aider à tester. – kevpie

+0

Je ne peux pas encore +1 mais je vais y plonger demain soir. Cela ressemble à des suggestions solides. Merci! –