如何测试403错误?

时间:2012-07-03 08:08:22

标签: django unit-testing http-status-code-403 http-error

我有一个测试类,测试所有页面对不同用户的访问。

这些访问是由我的每个视图上的装饰器定义的。

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

3 个答案:

答案 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!!!

希望这有助于其他人!