Как я могу тестировать представления py django

Я только учусь тестировать свой код в django, и мне нужна ваша помощь. Итак, я уже протестировал свой forms.py, и теперь я хочу протестировать свой views.py. Я знаю, что мне нужно проверить, размещает ли он пост на странице, как ответ на ORM, но я не могу понять, как это сделать, возможно, с помощью моих фабрик или нет? Это мой views.py

class AddPost(CreateView):
    model = Posts
    form_class = PostsForm
    template_name = 'posts/addpost.html'
    success_url = '/'

    def form_valid(self, form):
        instance = form.save(commit=False)
        if self.request.user.is_authenticated:
            instance.owner = self.request.user
        instance.save()
        return HttpResponseRedirect(self.get_success_url())


class ShowPost(ListView):
    model = Posts
    template_name = 'posts/allposts.html'
    paginate_by = 2

это тест_формы

@pytest.mark.django_db(True)
class TestPostCreationForm:
    def test_form(self):
        proto_post = PostsFactory.build()
        form_payload = {
            'phone_number': proto_post.phone_number,
            'title': proto_post.title,
            'type': proto_post.type,
            'text': proto_post.text,
            'price': proto_post.price,
            'status': proto_post.status,
            'image': proto_post.image,
        }

        form = PostsForm(form_payload)
        assert form.is_valid()

        instance = form.save()

        assert instance.phone_number == proto_post.phone_number
        assert instance.title == proto_post.title
        assert instance.price == proto_post.price

и фабрики

from users.tests.factories import UserFactory


def get_mock_img(name='test.png', ext='png', size=(50, 50), color=(256, 0, 0)):
    file_obj = BytesIO()
    image = Image.new("RGB", size=size, color=color)
    image.save(file_obj, ext)
    file_obj.seek(0)
    return File(file_obj, name=name)


class PostsFactory(factory.DjangoModelFactory):
    owner = SubFactory(UserFactory)
    phone_number = factory.Faker("phone_number", locale='uk_UA')
    title = factory.fuzzy.FuzzyText(length=50)
    text = factory.fuzzy.FuzzyText(length=250)
    price = factory.fuzzy.FuzzyDecimal(10.5, 50.5)
    status = factory.fuzzy.FuzzyChoice(choices=['active', 'deactivated'])
    type = factory.fuzzy.FuzzyChoice(choices=['private', 'business'])
    image = get_mock_img()

    class Meta:
        model = 'posts.Posts'

Используйте клиент тестирования Django. Хотя я не использую pytest, поэтому не могу быть уверен, что он полностью отделен от тестового бегуна Django, который я использую. Я бы удивился, если бы это было не так

Типичное использование (POST к простой форме, которая, как ожидается, будет успешной и перенаправленной)

    data = {
        "number_per_gridbox": "10", 
        "submit": "Submit" }

    url_fill_gridbox = reverse( "jobs:qa_break_into_gridboxes", 
        kwargs={'jobline': self.jobline.pk   ,'stockline': self.stockline.pk})

    response = self.client.post( url_gridbox, data)
    self.assertRedirects( response, url_fill_gridbox)

там, где вы тестируете ответы на ошибки или GET, вы можете получить отрисованный HTML с помощью

body = response.content.decode()

и вы можете посмотреть сущности в контекстных данных, которые были использованы для рендеринга:

form_errors = response.context['form'].errors

Что касается установки некоторых объектов для обработки представлением, вы можете либо просто создать и сохранить их с помощью кода (часто в методе setUp), либо использовать faker и factory-boy

Вернуться на верх