我有一个测试类,用于测试不同用户对所有页面的访问。
这些访问权限是由装饰器在我的每个视图上定义的。
视图.py:
@login_required
def afficher(request):
...
...
@creation_permission_required
def ajouter(request):
...
...
其中一些装饰器是由我定义的。
装饰器.py:
def creation_permission_required(function):
@wraps(function)
@login_required
def decorateur(request, *k, **a):
user = get_object_or_404(User, username__iexact=request.user.username)
if user.is_superuser or user.get_profile().creation:
return function(request, *k, **a)
else:
return HttpResponseRedirect(reverse("non_autorise"))# <--- PROBLEM
return decorateur
return function
当我测试它们时,我使用 status_code 属性来验证用户是否可以访问该页面
测试.py:
c = Client()
c.login(username='aucun', password='aucun')
for url in self.url_aucun:
r = c.get(reverse(url['url'], args=url['args']))
self.assertEqual(r.status_code, 200)
for url in self.url_creation:
r = c.get(reverse(url['url'], args=url['args']))
self.assertEqual(r.status_code, 302) # <--- SECOND PROBLEM
当用户无权访问某个页面时,该页面应返回 403 错误(禁止访问)。如何测试 403 而不是 302 ?
编辑:我尝试使用 HttpResponseForbidden(reverse("non_autorise")),但无法获得任何内容。因此,我尝试制作自己的 HttpResponse ,它是 HttpResponseRedirect 的精确副本,但使用另一个 status_code (403)仍然没有得到任何内容......
装饰器.py:
class HttpResponseTest(HttpResponse):
def __init__(self, redirect_to):
super(HttpResponseTest, self).__init__()
self['Location'] = iri_to_uri(redirect_to)
self.status_code = 403
def creation_permission_required(function):
@wraps(function)
@login_required
def decorateur(request, *k, **a):
user = get_object_or_404(User, username__iexact=request.user.username)
if user.is_superuser or user.get_profile().creation:
return function(request, *k, **a)
else:
return HttpResponseTest(reverse("non_autorise"))# <--- PROBLEM
return decorateur
return function