Тестирование в django

endronio

Новичок
Пользователь
Окт 29, 2020
13
0
1
Тестирую вьюху в django но выбивает ошибку 405!=201 где именно совершил ошибку подскажите

Python:
сlass AddStarRating(View):
    """Добавление рейтинга фильму"""

    def get_client_ip(self, request):
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            ip = x_forwarded_for.split(',')[0]
        else:
            ip = request.META.get('REMOTE_ADDR')
        return ip

    def post(self, request):
        form = RatingForm(request.POST)
        if form.is_valid():
            Rating.objects.update_or_create(
                ip=self.get_client_ip(request),
                movie_id=int(request.POST.get("movie")),
                defaults={'star_id': int(request.POST.get("star"))}
            )
            return HttpResponse(status=201)
        else:
            return HttpResponse(status=400)

вот сам тест:
Python:
def test_rating_views(self):
    factory = RequestFactory()
    request = factory.get("")
    request.user = self.user
    response = AddStarRating.as_view()(request)
    self.assertEqual(response.status_code, 201))
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
получается что тест некорректен?
нужно для данной view переписывать его?
Смотря что вы тестите, если к примеру вы тестите что нельзя изменить рейтинг get-запросом, то можно поменять в ассерте код на такой:
Python:
self.assertEqual(response.status_code, 405)
и тест будет корректным.
Если вы хотите протестить именно работу формы, то надо переделывать тест на post-запрос и передавать тестовые данные для формы.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Судя по ошибке у вас не проходит тест в этой строке (не выполняется условие):
Python:
self.assertEqual(response.status_code, 201))
То есть ожидает код 201 CREATED, а получается 405 METHOD NOT ALLOWED
Видимо вьюха не принимает метод GET.
Попробуйте обратится к вьюхе через браузер (для проверки).
 

endronio

Новичок
Пользователь
Окт 29, 2020
13
0
1
Судя по ошибке у вас не проходит тест в этой строке (не выполняется условие):
Python:
self.assertEqual(response.status_code, 201))
То есть ожидает код 201 CREATED, а получается 405 METHOD NOT ALLOWED
Видимо вьюха не принимает метод GET.
Попробуйте обратится к вьюхе через браузер (для проверки).
Если вы про работоспособность вьхи, то она рабочая
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Если вы про работоспособность вьхи, то она рабочая
То есть в браузере по get-запросу она не выдает ошибку 405.
 

endronio

Новичок
Пользователь
Окт 29, 2020
13
0
1
То есть в браузере по get-запросу она не выдает ошибку 405.
нет
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Значит тест не корректный если в тесте получается 405, а в браузере 200.
Полный код теста покажите и еще файл urls.py чтобы посмотреть к какому роуту вьюха подключена.
 

endronio

Новичок
Пользователь
Окт 29, 2020
13
0
1
Значит тест не корректный если в тесте получается 405, а в браузере 200.
Полный код теста покажите и еще файл urls.py чтобы посмотреть к какому роуту вьюха подключена.
Код:
path("add-rating/", views.AddStarRating.as_view(), name='add_rating')
это урлка
это и есть полный тест
Код:
class RatingForm(forms.ModelForm):
    """Форма добавления рейтинга"""
    star = forms.ModelChoiceField(
        queryset=RatingStar.objects.all(), widget=forms.RadioSelect(), empty_label=None
    )

    class Meta:
        model = Rating
        fields = ("star",)
это формы
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
это и есть полный тест
вы тесты пишите же файле test.py покажите этот файл полностью (чтобы понять что импортируйте и как тесты структурированы).
Просто по такому коду теста не очень понятно.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Код:
path("add-rating/", views.AddStarRating.as_view(), name='add_rating')
Попробуйте при создании реквеста через RequestFactory() передать правильный урл:
Python:
request = factory.get("add-rating/")
 

endronio

Новичок
Пользователь
Окт 29, 2020
13
0
1
Код:
path("add-rating/", views.AddStarRating.as_view(), name='add_rating')
Попробуйте при создании реквеста через RequestFactory() передать правильный урл:
Python:
request = factory.get("add-rating/")
Код:
from django.contrib.auth import get_user_model
from django.test import TestCase, RequestFactory


from movies.models import Reviews, Movie
from movies.views import AddStarRating, MovieDetailView


class CreateNewReviewTest(TestCase):
    def setUp(self):
        self.user = get_user_model().objects.create_user(username='test', password='12test12', email='test@example.com')
        self.movie = Movie.objects.create(
            url="5"
        )

        self.review = Reviews.objects.create(
            name='user1',
            email="test1@example.com",
            text='This is a test to check if a post is correctly created',
            movie=self.movie
        )

    def test_create_review_db(self):
        self.assertEqual(Reviews.objects.count(), 1)

    def test_rating_views(self):
        factory = RequestFactory()
        request = factory.get("add-rating/")
        request.user = self.user
        response = AddStarRating.as_view()(request)
        self.assertEqual(response.status_code, 201)
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Эту строку можно вынести в метод setUp():
Код:
factory = RequestFactory()
и вызывать как request = self.factory.get(...) чтобы не создавать экземпляр на каждый тест.

Что выдает после смены урла в реквесте?
 

endronio

Новичок
Пользователь
Окт 29, 2020
13
0
1
Эту строку можно вынести в метод setUp():
Код:
factory = RequestFactory()
и вызывать как request = self.factory.get(...) чтобы не создавать экземпляр на каждый тест.

Что выдает после смены урла в реквесте?
такая же ошибка
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
такая же ошибка
Попробуйте сделать:
Python:
print(response)
print(response.status_code)
перед ассертом
Чтобы посмотреть что приходит в респонс.
 

endronio

Новичок
Пользователь
Окт 29, 2020
13
0
1
Попробуйте сделать:
Python:
print(response)
print(response.status_code)
перед ассертом
Чтобы посмотреть что приходит в респонс.
<HttpResponseNotAllowed [POST, OPTIONS] status_code=405, "text/html; charset=utf-8">
405
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
<HttpResponseNotAllowed [POST, OPTIONS] status_code=405, "text/html; charset=utf-8">
Странно что при переходе по этому урлу в браузере вы не получайте ошибку 405.
 

endronio

Новичок
Пользователь
Окт 29, 2020
13
0
1
Странно что при переходе по этому урлу в браузере вы не получайте ошибку 405.
Код:
class RatingForm(forms.ModelForm):
    """Форма добавления рейтинга"""
    star = forms.ModelChoiceField(
        queryset=RatingStar.objects.all(), widget=forms.RadioSelect(), empty_label=None
    )

    class Meta:
        model = Rating
        fields = ("star",)
[/ICODE]
вот моя forms, тут как бы не переход на страницу, а мы устанавливаем рейтинг фильму, после того как установим, оно не переходит никуда, ip
передается в админку.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Попробовал запустить код вашей вьюхи в браузере - выдает ошибку 405, так как метод get(self, request): не определен.
Так что с тестом все нормально.
Просто чтобы тестить форму нужно делать post-запрос.
 

endronio

Новичок
Пользователь
Окт 29, 2020
13
0
1
Попробовал запустить код вашей вьюхи в браузере - выдает ошибку 405, так как метод get(self, request): не определен.
Так что с тестом все нормально.
Просто чтобы тестить форму нужно делать post-запрос.
получается что тест некорректен?
нужно для данной view переписывать его?
 

Форум IT Специалистов