我有以下问题。我正在学习一些教程来了解Django,现在我想做一个视图测试:
view.py
class OwnerListView(LoginRequiredMixin, generic.ListView):
model = Owner
paginate_by = 10 model.py
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 (适用于应用程序):
from django.urls import path
from . import views
urlpatterns = [
path('owners', views.OwnerListView.as_view(), name='owners'),
]我的问题来了。我想测试需要用户登录的视图。但我想在测试开始时这样做,然后再做我想做的所有测试,因为我认为这样会更有时间/代码/处理效率。
因此,我创建了以下代码:tests/test_views.py
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函数中设置会话,为什么没有保留会话?
发布于 2021-02-20 19:26:10
实际上,我会做一个改变,用setUpClass代替setUpTestData,因为第二个是非常特别的,有关于它的好文章
此外,如果不测试身份验证,则应该使用force_login
https://docs.djangoproject.com/en/3.1/topics/testing/tools/#django.test.Client.force_login
https://stackoverflow.com/questions/66290741
复制相似问题