Django:测试 LoginView 抛出 AssertionError

问题描述

问题 我正在为我的登录过程构建一个测试套件,并立即遇到了问题。我认为问题在于 LoginView 是一个“类”,而代码将它作为一个函数进行测试。断言 URL 解析为 LoginView 的正确方法是什么?

urls.py

from . import views
from users.views import *

from django.urls import path
from django.contrib.auth.views import LoginView,logoutView
from users.forms import LoginForm


urlpatterns = [
     path('',views.user_home_view,name='user_home'),path('sign_up',views.SignUpView.as_view()),path('login',LoginView.as_view(authentication_form=LoginForm),name='login'),path('logout',logoutView.as_view(),name='logout')
]

tests.py

from django.test import SimpleTestCase
from django.urls import reverse,resolve
from django.contrib.auth.views import LoginView,logoutView
from users.forms import LoginForm
from users.views import *

# Create your tests here.

class UrlTestCase(SimpleTestCase):

    def test_login_url_resolved(self):
        url = reverse('login')
        self.assertEquals(resolve(url).func,LoginView)

测试结果(./manage.py test

断言错误 !=

解决方法

解决方案

self.assertEquals(resolve(url).func.view_class,LoginView)

看到这个:django how to assert url pattern resolves to correct class based view function

,

这是因为您没有通过 LoginView 入口点方法取回 as_view() 类的实例而是适当的方法

您可以通过属性 view_class 访问类,该属性在 as_view() 方法中设置为 documented

返回的视图具有 view_class 和 view_initkwargs 属性。