代码之家  ›  专栏  ›  技术社区  ›  adamnfish

在django测试中检测权限错误

  •  5
  • adamnfish  · 技术社区  · 16 年前

    我正在为视图编写详细的功能测试,以补充模型上的单元测试。这是一个Django项目,我正在使用内置的Django测试框架和unittest。显然,签入这些功能测试的一个重要事项是权限设置正确。考虑到这一点,我想这样做:

    anonclient = Client()
    userclient = Client()
    userclient.login(username='test_user', password='test')
    adminclient = Client()
    adminclient.login(username='test_admin', password='test')
    
    path = "/path/to/my/page"
    anonresponse = anonclient.get(path)
    userresponse = userclient.get(path)
    adminresponse = adminclient.get(path)
    

    我需要能够确认anonclient和userclient在adminclient正常工作时都被拒绝了权限。但是,我找不到一种方法来测试是否发生了这种情况 强壮的 !

    起初,我决定检查响应是否是302重定向(因为权限检查失败的副作用正在被重定向),但这意味着无法区分自动重定向用户的功能和失败的权限检查之间的区别。(我不能用self.assert重定向(response,url)因为目标url可以通过视图中permission_required decorator的login_url参数重写!)

    也许我应该考虑扩展user_passes_test decorator,以便在测试失败时向响应对象添加属性?然后可以在测试中检查。如果失败,我将不得不通过检查请求的副作用是否已发生来确定请求是否成功。这样做是可行的,但这将是非常冗长的,尤其是与这些检查做了很多。

    非常感谢!

    2 回复  |  直到 16 年前
        1
  •  1
  •   Justin Abrahms    16 年前

    django测试客户机在调用login方法时返回一个布尔值,它告诉您登录是否成功。

    [17] >>> from django.test import Client
    [18] >>> c = Client()
    [19] >>> c.login(username='superuser', password='bar')
    [19] : False
    [20] >>> c.login(username='superuser', password='correct_password')
    [20] : True
    
        2
  •  1
  •   dinosaurwaltz    10 年前

    这个 permission_required 装饰工和 PermissionRequiredMixin 有一个 raise_exception 参数。

    一种可能的处理方法是 PERMISSIONS_RAISE_EXCEPTION=True settings_test.py (如果对测试运行使用单独的设置,并且

    from django.conf import settings
    
    @permission_required('<perm>',
                         raise_exception=settings.PERMISSIONS_RAISE_EXCEPTION)
    def your_view(...)
        pass
    
    class YourView(PermissionRequired):
        raise_exception = settings.PERMISSIONS_RAISE_EXCEPTION
    

    client.login('user', 'blah')
    response = client.get('/yourview')
    assertNot(403, response.status_code)
    

    permission_required decorators可能不适合您的口味,感觉有点像您在源代码中添加测试代码,但这是迄今为止我看到的唯一方法。