lundi 18 janvier 2021

Testing a CreateView with TestCase in Django

I'm new to unit testing in Django and I'm trying to test my CreateView which creates a new blog post when is submited, my first assertEquals which checks if the response code is 302 which practically means that the form was submited correctly because it was redirected is ok but the second check it gives me this error:

Traceback (most recent call last):
  File "/Users/aryanlilian/Desktop/EcoMon/blog/tests/test_views.py", line 53, in test_post_create_view_POST
    self.assertEquals(post.title, 'test post')
AssertionError: 'Test post' != 'test post'
- Test post
? ^
+ test post
? ^

my TestCase

from django.test import TestCase, Client
from django.urls import reverse
from blog.models import Post, Comment
from users.models import User


class TestViews(TestCase):

    def setUp(self):
        self.client = Client()
        self.blog_url = reverse('blog')
        self.tag_url = reverse('tag', args=['test'])
        self.post_url = reverse('post', args=['test-post'])
        self.add_post_url = reverse('add-post')
        self.user = User.objects.create(
            username='testuser',
            email='test@test.com',
            first_name='test',
            last_name='test',
            password='test'
        )
        self.post = Post.objects.create(
            author=self.user,
            title='Test post',
            content='test content post',
        )
        self.post.tags.add('test')

    def test_blog_list_view_GET(self):
        response = self.client.get(self.blog_url)
        self.assertEquals(response.status_code, 200)
        self.assertTemplateUsed(response, 'blog/blog.html')

    def test_tagged_post_list_view_GET(self):
        response = self.client.get(self.tag_url)
        self.assertEquals(response.status_code, 200)
        self.assertTemplateUsed(response, 'blog/blog.html')

    def test_post_detail_view(self):
        response = self.client.get(self.post_url)
        self.assertEquals(response.status_code, 200)
        self.assertTemplateUsed(response, 'blog/post.html')

    def test_post_create_view_POST(self):
        response = self.client.post(self.add_post_url, {
            'title': 'test post',
            'content' : 'test content',
            'category' : 'BUSSINESS',
            'tags' : 'test'
        })
        post = Post.objects.last()
        self.assertEquals(response.status_code, 302)
        self.assertEquals(post.title, 'test post')

my post model:

class Post(models.Model):

    class PostCategory(models.TextChoices):
        FAMILY = 'FAMILY', _('Family')
        BUSSINESS = 'BUSSINESS', _('Bussiness')
        MWRKETING = 'MARKETING', _('Marketing')
        SPENDINGS = 'SPENDINGS', _('Spendings')

    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(_('Title'), max_length=200, unique=True)
    content = models.TextField(_('Content'))
    category = models.CharField(_('Category'), max_length=9, choices=PostCategory.choices, default=PostCategory.BUSSINESS)
    slug = models.SlugField(_('Slug'), max_length=200, blank=True, null=False, unique=True)
    tags = TaggableManager(_('Tags'))
    published_date = models.DateTimeField(_('Published Date/Time'), auto_now_add=True)
    updated_date = models.DateTimeField(_('Updated Date/Time'), auto_now=True)

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)
        super().save(*args, **kwargs)

    @property
    def comments_count(self):
        return self.comments.count()

    def get_absolute_url(self):
        return reverse('blog')

my CreateView:

class PostCreateView(LoginRequiredMixin, IsSuperuserOrStaffMixin, CreateView):
    template_name = 'blog/add_post.html'
    form_class = PostCreateForm

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

urls.py:

path('post/<slug:slug>/', PostDetailView.as_view(), name='post'),

Aucun commentaire:

Enregistrer un commentaire