2010-09-01 4 views
6

J'ai une vue qui ressemble à ceci:Comment tester le contexte et la session dans Django après la redirection?

def login(request): 
    ... 
    # some variables has been set here 
    ... 
    if request.POST.get('remember_me', None): 
     request.session.set_expiry(1209600) # 2 weeks 
    return HttpResponseRedirect(reverse('dashboard')) 

maintenant Si j'affirme pour les variables en utilisant le contexte, je reçois l'erreur: « AttributeError: objet « HttpResponseRedirect » n'a pas d'attribut« contexte »c'est le même pour les sessions. Comment puis-je le tester alors que certaines variables ont été définies et que l'expiration possible de la session a été définie même si je redirige?

Répondre

5

Vous ne pouvez pas récupérer les variables de contexte à partir d'un HttpResponseRedirect. Cela n'a pas de sens pourquoi vous définissez les variables de contexte si vous redirigez de toute façon.

Vous devriez certainement être capable de ramasser des variables de la session après la redirection. Je l'ai fait dans plusieurs de mes cas de test. Comment affirmez-vous les données de session dans votre scénario de test?

Voilà comment je vais faire valoir à propos des variables de session après une redirection:

response = self.client.post(reverse('foo')) 
self.assertRedirects(response, reverse('bar', args = ['baz']), 
     status_code = 302, target_status_code = 200) 
self.assertEqual('value', self.client.session.get('key')) 

Self.client est une instance de django.test.client.Client dans ce cas.

Mise à jour

(En réponse au commentaire de @Marconi) Voici une façon d'afficher un message à l'utilisateur après redirection. Ceci est copié presque textuellement de mon answer à un autre question.

Votre première vue peut créer un message pour le courant utilisant auth et avoir la deuxième vue lue et l'efface. Quelque chose comme ceci:

def first_view(request, *args, **kwargs): 
    # all goes well 
    message = _("<message for user>") 
    request.user.message_set.create(message = message) 
    return redirect('second_view') 

def second_view(request, *args, **kwargs): 
    # Render page 

# Template for second_view: 
{% for message in messages %} 
    ... 
{% endfor %} 

Les messages sont enregistrés dans la base de données. Cela signifie que vous pouvez y accéder même après une redirection. Ils sont automatiquement lus et supprimés lors du rendu du modèle. Vous devrez utiliser RequestContext pour que cela fonctionne.

+0

La raison pour laquelle je cherchais à tester même contexte sur redirect est que j'utilise l'application django_notify et juste avant que la redirection des messages que je mis comme: request.notifications.error (_ (u "Il est soit votre e-mail ou le mot de passe est incorrect ")) puis de rediriger vers le formulaire de connexion afin que les formulaires ne conservent pas les valeurs précédemment entrées et que l'actualisation ne soumette pas de nouveau le formulaire. Je peux accéder aux notifications s'il n'y a pas de redirection en utilisant: response.context ['notifications'] Mais l'erreur ci-dessus apparaît quand il y a une redirection, je veux juste m'assurer que le message est affiché. Ou avez-vous un meilleur moyen? – Marconi

+0

@Marconi: J'ai mis à jour ma réponse. Voir au dessus. –

1

Ce que je l'ai fait (pour la session de vérification spécifique), est de ne pas utiliser le client de test de Django et de créer mon propre objet de demande maquette et le transmettre directement à mon avis, comme ceci:

def test_method(self): 
    class request(object): 
     POST = {'dummy':'data'} 
     class session: 
      @staticmethod 
      def set_expiry(nmbr): 
       request.session.nmbr = nmbr 

    views.login(request) 
    self.assertEqual(request.session.nmbr, 1209600) 

Une autre option peut utiliser l'argument "follow = True" lors de l'utilisation du client de test de Django.

Questions connexes