如何从视图类测试Django重定向

sha*_*ddy 4 python testing django django-unittest

我正在学习Django atm,我很难创建一个简单的测试用例.

我如何测试以下视图?如果用户已登录,则会将其重定向到列表视图.

from django.shortcuts import render
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.forms import AuthenticationForm
from django.views.generic import TemplateView
from django.core.urlresolvers import reverse
from django.shortcuts import redirect

class LoginView(TemplateView):
    """
    Base class for client area login.
    """
    def get(self, request, *args, **kwargs):
        """
        Display login form, only if user is not yet authenticated.
        Otherwise redirect to tickets index.
        :param request:
        :param args:
        :param kwargs:
        :return:
        """
        if request.user.is_authenticated():
            return redirect(reverse('tickets:index'))

        form = AuthenticationForm()

        return render(request, 'login.html', {'form': form})
Run Code Online (Sandbox Code Playgroud)

到目前为止,我创建的测试看起来像这样:

from django.test import TestCase, RequestFactory
from django.core.urlresolvers import reverse
from django.contrib.auth.models import User, AnonymousUser
from app.account.views import LoginView


class TestLoginForm(TestCase):

    def setUp(self):
        """
        Set up environment
        :return:
        """
        self.user = User.objects.create_user(username="test", password="test123", email="test@gmail.com")
        self.factory = RequestFactory()

    def tearDown(self):
        """
        Clean created user object
        :return:
        """
        self.user.delete()
        self.factory = None

    def test_login_form_redirect(self):
        """
        Test login redirect
        :return:
        """


        request = self.factory.get(reverse('account:login'))
        request.user = AnonymousUser()

        view = LoginView()
        response = view.get(request=request)
        self.assertEqual(response.status_code, 200)

        request.user = self.user
        response = view.get(request=request)
        self.assertRedirects(response, expected_url=reverse('tickets:index'), status_code=302, target_status_code=200)
Run Code Online (Sandbox Code Playgroud)

第一个断言已通过,但如果已经登录,则应该重定向用户的第二个断言会抛出此错误

AttributeError: 'HttpResponseRedirect' object has no attribute 'client'
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

sha*_*ddy 5

好的,我已经成功地使用以下代码制作了成功的测试用例

def test_login_form_redirect(self):
    """
    Test login redirect
    :return:
    """

    self.client.logout()

    response = self.client.get(reverse('account:login'))
    self.assertEqual(response.status_code, 200)

    self.assertTrue(self.client.login(username='test', password='test123'))
    response = self.client.get(reverse('account:login'))
    self.assertRedirects(response, expected_url=reverse('tickets:index'), status_code=302, target_status_code=200)
Run Code Online (Sandbox Code Playgroud)