我怎样才能对Django表单进行单元测试

ih99xse1  于 2023-02-14  发布在  Go
关注(0)|答案(1)|浏览(126)

我做覆盖率报告,有很多地方没有覆盖,你有什么想法,我如何写测试?
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')

型号.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}"

表单.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编写测试时,我得到了客户.模型.配置文件.不存在:配置文件匹配查询不存在。

7bsow1i6

7bsow1i61#

下面是您需要实现的内容,以获得测试函数的方法:

# 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/,请看一看。

相关问题