2015-03-26 1 views
0

J'ai un django DetailView que je l'ai écarté pour permettre à l'utilisateur de se désabonner des e-mails en utilisant une chaîne de requête dans la méthode get:Comment puis-je tester une méthode GET surchargée dans Django CBV?

class MemberProfileView(DetailView):             
     template_name = "profile.html"              
     model = Member                  

     def get(self, request, *args, **kwargs):           
      if request.GET.get('unsubscribe') is True:          
       request.user.email_me = False            
       request.user.save()              
      elif request.GET.get('unsubscribe') is False:         
       request.user.email_me = True            
       request.user.save()              
      self.object = self.get_object()            
      context = self.get_context_data(object=self.get_object)      
      return self.render_to_response(context) 

Cela fonctionne bien lorsque j'utilise le lien d'un e-mail. Toutefois, lorsque j'essaie de tester ce code, le client de test ne suit pas la méthode get remplacée dans le DetailView; il passe par une méthode get spécifique au client/suite test. Comment puis-je tester cette méthode get remplacée? Voici mon code de test:

def test_unsubscribe_link(self):             
    url = reverse('profile_page', args=[self.member.pk])       
    self.assertTrue(self.member.email_me)          
    response = self.client.get(url, {'unsubscribe': True})      
    self.assertFalse(self.member.email_me)          
    self.assertEqual(response.status_code, 200)         
    self.assertContains(response.content, "Email me reminder notifications: No") 
+0

Je pense que vous pourriez vouloir vérifier votre instruction if. Obtenir vous donne le contenu du dictionnaire, pas nécessairement vrai ou faux. Vous pouvez vérifier sans la partie "est vrai". Ou encore mieux "if" se désinscrire "request.GET". BTW, vous testez aussi deux fois pour la même condition dans l'autre (pas besoin). – Pynchia

+0

@Pynchia merci - l'URL que j'utilise d'un email contient une chaîne de requête - '? Unsubscribe = True' ou'? Unsubscribe = False'. Le second est de réinscrire les gens. Le problème auquel je suis confronté est que le client de test ne semble pas passer par cette méthode 'get' substituée que j'ai mise dans le' DetailView'! – YPCrumble

Répondre

2

Le problème est que la méthode n'est pas appelée, le problème est que vous ne rechargez pas les données de la base de données.

Un bon test ressemblerait à quelque chose comme ceci:

def test_unsubscribe_link(self):             
    url = reverse('profile_page', args=[self.member.pk]) 
    self.assertTrue(Member.objects.get(pk=self.member.pk).email_me) 
    response = self.client.get(url, {'unsubscribe': 'True'}) 
    # Reload data from database 
    self.assertFalse(Member.objects.get(pk=self.member.pk).email_me) 
    self.assertEqual(response.status_code, 200) 
    self.assertContains(response.content, "Email me reminder notifications: No") 

Notez que, même si vous passez True ou False dans votre chaîne de requête, lorsque vous recevez la valeur de request.GET il sera toujours une chaîne. Vous devrez vérifier les chaînes littérales 'True' et 'False', ou vous devez convertir la valeur en un booléen.

+0

vous avez raison, merci! Il s'avère que votre correctif et l'utilisation de 'RequestFactory' ont résolu l'ensemble du problème. Ma question était plus proche du problème 'RequestFactory' mais c'était aussi une erreur. Voir les documents: https://docs.djangoproject.com/fr/1.7/topics/testing/advanced/#django.test.RequestFactory – YPCrumble