Модульное тестирование в Django для CreateView

#python #django

#python #django

Вопрос:

У меня есть CreateView, с помощью которого я создаю новые сообщения в блоге, я хочу протестировать его, чтобы проверить, все ли в порядке, но что-то не так с моим тестом, и я не могу понять, что именно. это дает мне 2 ошибки, для первого метода я получаю эту ошибку:

 Traceback (most recent call last):
  File "C:UsersBularu LilianDesktopEcoMonblogteststest_views.py", line 73, in test_post_create_view_GET
    self.assertEquals(response.status_code, 200)
AssertionError: 302 != 200
 

и для второго — это ошибка:

  File "C:UsersBularu LilianDesktopEcoMonblogteststest_views.py", line 78, in test_post_create_view_POST_success
    post = Post.objects.get(title=self.post['title'])
  File "C:UsersBularu LilianDesktopEnvironmentsecomonlibsite-packagesdjangodbmodelsmanager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:UsersBularu LilianDesktopEnvironmentsecomonlibsite-packagesdjangodbmodelsquery.py", line 429, in get
    raise self.model.DoesNotExist(
blog.models.Post.DoesNotExist: Post matching query does not exist.
 

Это мой тестовый класс:

 class TestPostCreateViews(BaseTest):

    def test_post_create_view_GET(self):
        response = self.client.get(self.add_post_url)
        self.assertEquals(response.status_code, 200)
        self.assertTemplateUsed(response, 'blog/add_post.html')

    def test_post_create_view_POST_success(self):
        response = self.client.post(self.add_post_url, self.post, author=self.user, format='text/html')
        post = Post.objects.get(title=self.post['title'])
        self.assertEquals(response.status_code, 302)
        self.assertEquals(post.title, 'test post')
 

мой 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)

 

мой URL-путь:

 path('new/post/', PostCreateView.as_view(), name='add-post'),
 

моя форма:

 class PostCreateForm(forms.ModelForm):
    title = forms.CharField(widget=forms.TextInput(), max_length=200)
    content = forms.CharField(widget=forms.Textarea(attrs={'rows': 25, 'cols': 50}))

    class Meta:
        model = Post
        exclude = ['author', 'slug', 'published_date', 'updated_date']

 

и моя модель:

 class Post(models.Model):

    class PostCategory(models.TextChoices):
        FAMILY = 'FAMILY', _('Family')
        BUSINESS  = 'BUSINESS', _('Business')
        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.BUSINESS)
    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')

 

за любую помощь я был бы признателен

Ответ №1:

Попробуйте написать это так:

 def test_post_create_view_POST_success(self):
        data = {
            'author': self.user,
            'title': 'test_title',
            'content': 'test_content',
            'category': 'test_category',
            'slug': 'test_slug',
            'tags': None, # or create some tags and populate
        }
        response = self.client.post(self.add_post_url, data=data, follow=True) # make sure your url is correct too btw that could also be the issue
        self.assertEquals(response.status_code, 200)
        self.assertEquals(Post.objects.filter(title='test_title').count(), 1)