我有一个测试类,测试所有页面对不同用户的访问。
这些访问是由我的每个视图上的装饰器定义的。
views.py:
@login_required
def afficher(request):
...
...
@creation_permission_required
def ajouter(request):
...
...
这些装饰器中的一些是由我定义的。
decorators.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属性来验证用户是否可以访问该页面
test.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(反向(“non_autorise”)),但无法获取任何内容。那么我试着创建自己的HttpResponse,它是HttpResponseRedirect的精确副本,但是另一个status_code(403)仍然没有得到任何内容......decorators.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
答案 0 :(得分:1)
如果您想要403响应,如果您使用的是Django 1.4,则可以在装饰器中引发PermissionDenied异常。或者,您可以在装饰器中返回HttpResponseForbidden。您还必须构建a custom login_required decorator。
答案 1 :(得分:0)
self.assertEqual(r.status_code, 403)
答案 2 :(得分:0)
我有同样的问题,并通过指示测试get()使用follow=True
跟随重定向来解决它。使用BlueMagma的例子看起来像这样:
for url in self.url_creation:
r = c.get(reverse(url['url'], args=url['args']), follow=True)
self.assertEqual(r.status_code, 403) # <--- SECOND PROBLEM NO MORE!!!
希望这有助于其他人!