Как я могу создать модульные тесты для этой Django Form

Я делаю отчет о покрытии и есть много мест, которые не покрыты, есть ли у вас идеи, как мне написать тест для этого?

этот views.py не был покрыт

def addreview(request, u_id, shop_id):
    url = request.META.get('HTTP_REFERER')
    shop = shop_detail.objects.get(id=shop_id)
    user = Profile.objects.get(customer=u_id)
    if request.method == 'POST':
        form = ReviewForm(request.POST)
        if form.is_valid():
            data = Review()
            data.review_text = form.cleaned_data['review_text']
            data.review_rating = form.cleaned_data['review_rating']
            data.shop = shop
            data.user = user
            data.save()
            return redirect(url)


def rating(request):
    if not request.user.is_authenticated:
        return HttpResponseRedirect(reverse('customer_login'))
    if request.method == 'POST':
        form = RateUsForm(request.POST)
        if form.is_valid():
            rate = RateUs()
            rate.rate_text = form.cleaned_data['rate_text']
            rate.rating = form.cleaned_data['rating']
            rate.user = request.user
            rate.save()
            return HttpResponseRedirect(reverse("index"))
    return render(request, 'shop/rate.html')

models.py

class Review(models.Model):
    user = models.ForeignKey(Profile,on_delete=models.CASCADE)
    shop = models.ForeignKey(shop_detail,on_delete=models.CASCADE)
    review_text = models.TextField(max_length=300)
    review_rating = models.IntegerField()

    def __str__(self):
        return f"{self.review_rating}"


class RateUs(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    rate_text = models.TextField()
    rating = models.IntegerField()

    def __str__(self):
        return f"{self.rating}"

forms.py

class ReviewForm(forms.ModelForm):
    class Meta:
        model= Review
        fields= ["review_text", "review_rating"]

class RateUsForm(forms.ModelForm):
    class Meta:
        model= RateUs
        fields= ["rate_text","rating"]

Вот что я пишу для рейтинга

def test_valid_rating(self):
        rateus1 = RateUs.objects.first()
        data={
            "user": rateus1.user,
            "rate_text": rateus1.rate_text,
            "rating": rateus1.rating
        }
        response = self.client.post(reverse('rating'), data=data)
        self.assertEqual(response.status_code, 302)

Когда я пытаюсь написать тест для addreview, я получаю customer.models.Profile.DoesNotExist: Профиль, соответствующий запросу, не существует.

Вот что вам нужно реализовать, чтобы получить способ тестирования вашей функции:

# Imports needed
import pytest
from unittest.mock import MagicMock, patch

def test_addreview(self):
    # Here probably you will need to create a User before.
    user = User.objects.create(username='testuser', id=15445)
    shop = shop_detail.objects.create(id=19889)
    Profile.objects.create(customer=user.pk)
    mock_request = MagicMock(
        POST={'review_text': 'test', 'review_rating': 5},
        META={'HTTP_REFERER': 'http://testserver/'},
        method='POST',
    )
    self.assert(Review.objects.count(), 0)
    with patch('django.shortcuts.redirect') as redirect_mock:
        addreview(mock_request, user.pk, shop.pk)
    redirect_mock.assert_called_with('http://testserver/')
    self.assert(Review.objects.count(), 1)


def test_addreview_not_redirected(self):
    # Here probably you will need to create a User before.
    user = User.objects.create(username='testuser', id=15445)
    shop = shop_detail.objects.create(id=19889)
    Profile.objects.create(customer=user.pk)
    mock_request = MagicMock(
        POST={'review_text': 'test', 'review_rating': 5},
        META={'HTTP_REFERER': 'http://testserver/'},
        method='GET',
    )
    self.assert(Review.objects.count(), 0)
    with patch('django.shortcuts.redirect') as redirect_mock:
        addreview(mock_request, user.pk, shop.pk)
    redirect_mock.assert_not_called()
    self.assert(Review.objects.count(), 0)

def test_addreview_raise_exception_profile_not_found(self):
    # Here probably you will need to create a User before.
    user = User.objects.create(username='testuser', id=15445)
    shop = shop_detail.objects.create(id=19889)
    mock_request = MagicMock(
        POST={'review_text': 'test', 'review_rating': 5},
        META={'HTTP_REFERER': 'http://testserver/'},
        method='GET',
    )
    self.assert(Review.objects.count(), 0)
    self.assert(Profile.objects.count(), 0)
    with pytest.raises(Profile.DoesNotExist):
        addreview(mock_request, user.pk, shop.pk)
    self.assert(Review.objects.count(), 0)
    self.assert(Profile.objects.count(), 0)

Возможно, вам придется немного адаптировать каждый пример, так как это всего лишь руководство по тому, как вы должны его реализовать.

  • При работе с таким тестом, если вы, например, ожидаете, что Profile будет существовать, вам нужно создать его заранее, чтобы предусмотреть строки кода, которые будут выполнены после вызова функции.
  • Макеты очень важны, в этом случае мы имитируем request и моделируем все свойства, которыми обладает request.
  • Мы также подражаем redirect, но в данном случае только для того, чтобы узнать, был ли он вызван или нет.
  • В конце мы генерируем кейс, в котором ожидаем, что код сгенерирует исключение при вызове функции.
  • Обычно для создания объектов модели в тесте лучше всего использовать https://factoryboy.readthedocs.io/en/stable/, посмотрите на это.
Вернуться на верх