Как я могу создать модульные тесты для этой 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/, посмотрите на это.