如何在Django CBV中测试重写的GET方法?

时间:2015-03-26 13:19:12

标签: python django unit-testing

我有一个django DetailView我已覆盖,允许用户使用get方法中的查询字符串取消订阅电子邮件:

  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) 

当我使用电子邮件中的链接时,此功能正常。但是,当我尝试测试此代码时,测试客户端并未遵循get中被覆盖的DetailView方法;它通过特定于测试客户端/套件的get方法。如何测试此重写的get方法?这是我的测试代码:

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")

1 个答案:

答案 0 :(得分:2)

问题不在于该方法没有被调用,问题是您没有从数据库重新加载数据。

正确的测试看起来像这样:

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")

请注意,即使您在查询字符串中传递TrueFalse,当您从request.GET收到值时,它也始终是一个字符串。您需要检查文字字符串'True''False',或者您需要以某种方式将值转换为布尔值。