如何检查响应是否以表格形式显示?

时间:2019-03-11 16:01:24

标签: python django unit-testing

就像标题一样,我不知道如何测试响应是否为具有表单的视图,因为在我看来,用户仅在request.user.is_authenticated时才获得表单。

Y

我有视图测试来检查视图是否加载,但是经过身份验证的用户和未经身份验证的用户都可以访问该视图,唯一的区别是没有经过身份验证的用户正在获取无格式的视图,而且我不知道如何进行测试。

##views.py

def product_detail(request, id, slug):

    product = get_object_or_404(Product, id=id, slug=slug,)
    comments = product.comments.all()

    if request.user.is_authenticated:
        if request.method == 'POST':
            form = CommentForm(request.POST)
            if form.is_valid():
                new_comment = form.save(commit=False)
                new_comment.product = product
                new_comment.nick = get_object_or_404(User, id=str(request.user.id))
                form.save()
                return redirect('product_detail', id=product.id, slug=product.slug)
        else:
            form = CommentForm()

        return render(request, 'shop/product/Product_detail.html',
                      {'product': product, 'form': form, 'comments': comments})

    else:
        return render(request, 'shop/product/Product_detail.html',
                      {'product': product, 'comments': comments})

3 个答案:

答案 0 :(得分:1)

在上下文中找到表单类:

self.assertIsInstance(response.context['form'], CommentForm) #find your form in context

答案 1 :(得分:1)

您可以从测试客户端返回的response中获得使用的上下文。

self.assertTrue('form' in response.context)

但是,这不应该成为您测试用户是否登录的方式;仅将某些上下文变量是否传递到模板。

答案 2 :(得分:0)

您可以在self.client.login(username='user', password='pass')内部使用test_call_view_loads来做到这一点:

from django.test.client import Client

def setUp(self):
    self.client = Client()
    self.user = User.objects.create_user('user', 'user@email.com', 'pass')


def test_call_view_loads_loggined_user(self):
    product = Product.objects.get(id=1)
    self.client.login(username='user', password='pass')  # login the user
    response = self.client.get(f'/shop/{product.id}/{product.slug}/')
    self.assertEqual(response.status_code, 200)
    self.assertTemplateUsed(response, 'shop/product/Product_detail.html')
    self.assertTrue('form' in response.context)  # for check that is form in context or not