lundi 30 septembre 2019

Need help writing a Unit Test in Django

Good day everybody.

I need to test a view, and I got stuck ( I am a django newbie). I got through all other url and view tests, but I'm really not sure how to write this one.

I tried writing it on my own, I read through the testing docs, I even tried testing this using model_mommy ( but I got a custom HTML field in my models ) which is not supported by mommy. I tried with mommy Recipes, also without luck. I really gotta do this test today, it's a part of a task I was given.

here is the view :

class CommentCreateView(CreateView):

    def get(self, request, *args, **kwargs):
        context = {'form': CommentForm()}
        return render(request, 'news/add_comment_to_article.html', context)

    def post(self, request, *args, **kwargs):
        form = CommentForm(request.POST)
        if form.is_valid():
            article = get_object_or_404(Article, pk=kwargs.get('pk'))
            print(article)
            comment = form.save(commit=False)
            comment.post = article
            comment.save()
            return HttpResponseRedirect(reverse('news:article', kwargs={'article_id': article.pk}))
        else:
            form = CommentForm()
            return render(request, 'news/add_comment_to_article.html', {'form': form})

and here are my models:

class Article(models.Model):
    title = models.CharField('title', max_length=200, blank=True)
    slug = AutoSlugField(populate_from='title', default="",
                         always_update=True, unique=True)
    author = models.CharField('Author', max_length=200, default="")
    description = HTMLField()
    is_published = models.BooleanField(default=False)
    article_text = HTMLField('Article text', default="")
    pub_date = models.DateTimeField(default=datetime.now, blank=True)
    article_category = models.ForeignKey(Category, on_delete="models.CASCADE", blank=True, null=True, default="")
    my_order = models.PositiveIntegerField(default=0, blank=False, null=False)

    class Meta(object):
        ordering = ['my_order']

    def __str__(self):
        print(self.image.all())
        return self.title


class ArticleImages(models.Model):
    article = models.ForeignKey(Article, on_delete="models.CASCADE", related_name="image")
    image = models.ImageField("image")
    my_order = models.PositiveIntegerField(default=0, blank=False, null=False)

    def image_tag(self):
        return mark_safe('<img src="/media/%s" width="150" height="150" />' % (self.image))

    image_tag.short_description = 'Image'

    class Meta(object):
        ordering = ['my_order']

    def __str__(self):
        return self.image.url


class Comment(models.Model):
    post = models.ForeignKey('Article', on_delete=models.CASCADE, related_name='comments')
    author = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=datetime.now, blank=True)
    approved_comment = models.BooleanField(default=False)

    def approve(self):
        self.approved_comment = True
        self.save()

    def __str__(self):
        return self.text

I would REALLY appreciate someone helping me out here. Thank you, and have a good day !

Aucun commentaire:

Enregistrer un commentaire