首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在django unitest中设置后,登录会话不再有效

在django unitest中设置后,登录会话不再有效
EN

Stack Overflow用户
提问于 2021-02-20 18:59:41
回答 1查看 47关注 0票数 0

我有以下问题。我正在学习一些教程来了解Django,现在我想做一个视图测试:

view.py

代码语言:javascript
复制
class OwnerListView(LoginRequiredMixin, generic.ListView):
    model = Owner
    paginate_by = 10    

model.py

代码语言:javascript
复制
class Owner(models.Model):

    username = models.TextField(max_length=100)
    
    first_name = models.TextField(null=True, max_length=100)
    
    last_name = models.TextField(null=True, max_length=100)
    
    email = models.EmailField(null=True)
    
    def __str__(self):
        """String for representing the Model object."""
        return self.username
    
    def get_absolute_url(self):
        """Returns the url to access a particular instance of the model."""
        return reverse('owner', args=[int(self.pk)])
    class Meta:
        ordering = ['-username']

url.py (适用于应用程序):

代码语言:javascript
复制
from django.urls import path

from . import views


urlpatterns = [
    path('owners', views.OwnerListView.as_view(), name='owners'), 
]

我的问题来了。我想测试需要用户登录的视图。但我想在测试开始时这样做,然后再做我想做的所有测试,因为我认为这样会更有时间/代码/处理效率。

因此,我创建了以下代码:tests/test_views.py

代码语言:javascript
复制
from django.test import TestCase, Client
from django.urls import reverse
from django.contrib.auth.models import User

from inventory_items.models import Owner

class OwnerListViewTest(TestCase):
    @classmethod
    def setUpTestData(self):
        # Create 13 authors for pagination tests
        number_of_owners = 13

        for owner_id in range(number_of_owners):
            Owner.objects.create(
                first_name=f'FirstName {owner_id}',
                last_name=f'LastName {owner_id}',
                username=f'Username {owner_id}',
            )
        
        # Login
        User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
        self.client = Client()
        self.client.login(username='john', password='johnpassword')


    def test_view_url_accessible_by_name(self):
        self.client.login(username='john', password='johnpassword')
        response = self.client.get(reverse('owners'))
        self.assertEqual(response.status_code, 200)


    def test_pagination_is_ten(self):
        # self.client.login(username='john', password='johnpassword')
        response = self.client.get(reverse('owners'))
        self.assertEqual(response.status_code, 200)
        self.assertTrue('is_paginated' in response.context)
        self.assertTrue(response.context['is_paginated'] == True)
        self.assertTrue(len(response.context['owner_list']) == 10)

所以第一个测试运行正常,因为我在测试用例中进行测试,但在第二个测试中,我注释了这一行,因为我希望在设置中完成登录,但它返回302,因为它重定向到登录。

如果我在setup函数中设置会话,为什么没有保留会话?

EN

回答 1

Stack Overflow用户

发布于 2021-02-20 19:26:10

实际上,我会做一个改变,用setUpClass代替setUpTestData,因为第二个是非常特别的,有关于它的好文章

https://medium.com/an-engineer-a-reader-a-guy/django-test-fixture-setup-setupclass-and-setuptestdata-72b6d944cdef

此外,如果不测试身份验证,则应该使用force_login

https://docs.djangoproject.com/en/3.1/topics/testing/tools/#django.test.Client.force_login

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66290741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档