6

Django 1.9.6

我想写一些单元测试来检查重定向。

你能帮我理解我在这里做错了什么吗?

先感谢您。

考试:

from django.test import TestCase
from django.core.urlresolvers import reverse
from django.http.request import HttpRequest
from django.contrib.auth.models import User

class GeneralTest(TestCase):

    def test_anonymous_user_redirected_to_login_page(self):
        user = User(username='anonymous', email='vvv@mail.ru', password='ttrrttrr')
        user.is_active = False        
        request = HttpRequest()
        request.user = user
        hpv = HomePageView()
        response = hpv.get(request)
        self.assertRedirects(response, reverse("auth_login"))

结果:

错误:test_anonymous_user_redirected_to_login_page (general.tests.GeneralTest)

回溯(最后一次调用):文件“/home/michael/workspace/photoarchive/photoarchive/general/tests.py”,第 44 行,在 test_anonymous_user_redirected_to_login_page self.assertRedirects(response,reverse(“auth_login”))文件“/home /michael/workspace/venvs/photoarchive/lib/python3.5/site-packages/django/test/testcases.py”,第 326 行,在 assertRedirects redirect_response = response.client.get(path, QueryDict(query), AttributeError: 'HttpResponseRedirect' 对象没有属性 'client'


在 0.953 秒内运行 3 次测试

什么 pdb 说:

-> self.assertRedirects(response, reverse("auth_login"))
(Pdb) response
<HttpResponseRedirect status_code=302, "text/html; charset=utf-8", url="/accounts/login/">
4

2 回答 2

5

您需要将客户端添加到响应对象。请参阅下面的更新代码。

from django.test import TestCase, Client
from django.core.urlresolvers import reverse
from django.http.request import HttpRequest
from django.contrib.auth.models import User

class GeneralTest(TestCase):

    def test_anonymous_user_redirected_to_login_page(self):
        user = User(username='anonymous', email='vvv@mail.ru', password='ttrrttrr')
        user.is_active = False        
        request = HttpRequest()
        request.user = user
        hpv = HomePageView()
        response = hpv.get(request)
        response.client = Client()
        self.assertRedirects(response, reverse("auth_login"))
于 2016-09-29T20:13:13.503 回答
4

看起来您是直接调用视图get而不是使用内置的Client. 当您使用测试客户端时,您会在响应中返回您的客户端实例,大概是在您想要检查/获取重定向的情况下。

一种解决方案是使用客户端从您的视图中获取响应。另一个是如上所述在响应中粘住客户。

第三种选择是告诉assertRedirects不要获取重定向。如果您不要求断言获取重定向,则不需要客户端。这是通过添加fetch_redirect_response=False到您的断言来完成的。

于 2018-10-29T20:59:11.753 回答