Django Преобразование в тесты CBV + - PullRequest
0 голосов
/ 29 сентября 2019

Я пытаюсь проверить свое приложение.Я просмотрел документацию и смог сделать тест для моих URL-адресов и всех представлений, кроме одного.

У меня проблемы с преобразованием его в представление класса, и я не совсем уверен, какие тесты следует выполнять.Я делаю здесь?В документации объясняется, как это работает, но я не знаю, куда идти дальше ...

Кто-нибудь может мне помочь?

вот представление, которое я пытаюсь преобразовать и проверить:

def add_comment_to_article(request, pk):
    article = get_object_or_404(Article, pk=pk)
    if request.method == "POST":
        form = CommentForm(request.POST)
        if form.is_valid():
            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})


мои URL:

app_name = "news"
urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('<int:article_id>/', views.article_view, name='article'),
    path('articles/', views.ArticlesView.as_view(), name='articles'),
    path('search/', include('haystack.urls',)),
    path('<int:pk>/comment/', views.CommentCreateView.as_view(), name='add_comment_to_article'),
    #path('articles/<int:category_id>', views.CategoryView.as_view(), name="category")
]

моя форма:

class CommentForm(forms.ModelForm):

    class Meta:
        model = Comment
        fields = ('author', 'text',)

Представление отвечает за добавление комментария к моей статье.Спасибо !!

1 Ответ

1 голос
/ 29 сентября 2019

Итак, если у вас нет поля post в вашем CommentForm, я, возможно, сделаю что-то вроде этого:

# views.py
from django.views.generic import CreateView

from .models import Comment


class CommentCreateView(CreateView):
    model = Comment
    form_class = CommentForm
    template_name = 'my_template.html'

    def form_valid(self, *args, **kwargs):
        article = get_object_or_404(Article, pk=kwargs.get('pk'))
        comment = form.save(commit=False)
        comment.post = article
        comment.save()
        return HttpResponseRedirect(reverse('news:article', kwargs={'article_id': article.pk}))

# tests.py

from django.tests import TestCase


class CreateCommentViewTestCase(TestCase):

    def setUp(self):
        # maybe look into factory boy if you haven't already
        self.article = Article.objects.create()

    def test_get(self):
        response = self.client.get(reverse('news:add_comment_to_article', kwargs={'article_id': self.article.pk}))
        self.assertEqual(response.status_code, 200)

    def test_post(self):
        # populate with form data
        post_data = {'form_field': 'value'}
        original_comment_count = self.article.comment_set.all().count()
        response = self.client.post(reverse('news:add_comment_to_article', kwargs={'article_id': self.article.pk}))
        new_comment_count = self.article.comment_set.all().count()
        self.assertNotEqual(original_comment_count, new_comment_count)
        self.assertEqual(response.status_code, 302)

django-webtest очень полезно для тестированияCBV тоже.

...