Django Test case для удаления поста возвращает Https 200 вместо 302 - PullRequest
1 голос
/ 10 октября 2019

Я пишу тестовый пример для приложения Posts в моем проекте Django. Я определил виды для добавления нового сообщения, перечисления сообщений, просмотра сведений о сообщении, редактирования сообщения и удаления сообщения. Добавление нового сообщения перенаправляет страницу в подробный вид этой страницы, а удаление сообщения перенаправляет страницу в представление списка. При написании тестов для того же самого я получаю код ответа https 302 для нового сообщения, как и ожидалось, но для сообщения об удалении я получаю только ответ https 200, хотя он должен быть 302.

Добавление необходимого коданиже. Пожалуйста, не стесняйтесь спрашивать больше кода, связанного с этим, если это необходимо.

Есть ли какая-то концепция, которую я упускаю? Любое руководство приветствуется.

Заранее спасибо.

Test.py

from django.test import TestCase
from .models import Post
from django.urls import reverse, reverse_lazy


class PostTest(TestCase):
    def setUp(self):
        '''This function inserts 
        dummy data into database
        to check during testing'''
        self.post = Post.objects.create(title='Test', content='abcd', author='testauthor@testing.test')



    def test_post_content(self):
        post_object = Post.objects.get(pk=1)
        expected_object_title = f'{post_object.title}'
        expected_object_content = f'{post_object.content}'
        expected_object_author = f'{post_object.author}'
        self.assertEqual(expected_object_title,'Test')
        self.assertEqual(expected_object_content, 'abcd')
        return self.assertEqual(expected_object_author, 'testauthor@testing.test')

    def test_post_list_view(self):
        response = self.client.get(reverse('lists'))
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, 'Test')
        self.assertTemplateUsed(response, 'index.html')

    def test_post_details(self):
        response = self.client.get('/detail/1/')
        no_response = self.client.get('/detail/100/')
        self.assertEqual(response.status_code, 200)
        self.assertEqual(no_response.status_code, 404)
        self.assertContains(response, 'abcd')
        self.assertTemplateUsed(response, 'detailed.html')

    def test_newpost_view(self):
        response = self.client.post(reverse('addpost'),{
            'title' : 'New title',
            'content' : 'New Content',
            'author' : 'test@gmail.com',
            })
        self.assertEqual(response.status_code, 302)
        #self.assertContains(response,'New Content')


    def test_post_update_view(self):
        response = self.client.post(reverse('update', args='1'),{
            'title': 'Updated title',
            'content' : 'Updated content',
            })
        self.assertContains(response, 'Updated title')
        self.assertEqual(response.status_code, 200)

    def test_postdelete_view(self):
        response = self.client.get(reverse('delete',args='1'))
        self.assertEqual(response.status_code,302)

views.py

from django.shortcuts import render
from django.views.generic import ListView, DetailView
from django.views.generic.edit import CreateView,UpdateView, DeleteView
from django.urls import reverse,reverse_lazy


from .models import Post

class ListingView(ListView):
    model = Post
    template_name = 'index.html'
    context_object_name = 'list_of_posts'

class DetailedListView(DetailView):
    model = Post
    template_name = 'detailed.html'

class AddPostView(CreateView):
    model = Post
    template_name = 'addpost.html'
    fields = ['title','author', 'content']

class PostUpdateView(UpdateView): 
    model = Post
    template_name = 'update.html'
    fields = ['title', 'author', 'content']

class DeletePostView(DeleteView):
    model = Post
    template_name = 'deleteview.html'
    success_url = reverse_lazy('lists')

Models.py

from django.db import models
from django.urls import reverse

class Post(models.Model):
    title = models.CharField(max_length=50)
    content = models.TextField()
    author = models.EmailField()

    def __str__(self):
        return self.title[:30]

    def get_absolute_url(self):
        return reverse('detailed', args=[str(self.id)])

1 Ответ

2 голосов
/ 10 октября 2019

response = self.client.get (reverse ('delete', args = '1'))

Используя GET запрос, вы запрашиваете шаблон 'deleteview.html' который необходимо заполнить, чтобы удалить объект. Следовательно, код состояния 200 является правильным.

Вы должны использовать запрос POST (или DELETE). Который удалит объект и перенаправит на success_url = reverse_lazy('lists'). Следовательно, вы получите код состояния 302.

Чтобы понять это, посмотрите на код DeleteView .

...