我有一个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")
答案 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")
请注意,即使您在查询字符串中传递True
或False
,当您从request.GET
收到值时,它也始终是一个字符串。您需要检查文字字符串'True'
和'False'
,或者您需要以某种方式将值转换为布尔值。