在django测试中检测权限错误

时间:2010-04-14 14:43:29

标签: python django unit-testing permissions client

我正在为我的视图编写详细的功能测试,以补充我的模型上的单元测试。这是一个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)

我需要能够确认在adminclient正常工作时,anonclient和userclient都被拒绝了。然后,我找不到一种方法来测试这种情况发生了吗强有力地

起初我决定检查响应是否为302重定向(因为重定向失败权限检查的副作用),但这意味着无法区分自动重定向用户的功能和失败的功能权限检查。 (我不能只使用self.assertRedirects(response,url),因为目标url可以通过视图中的permission_required装饰器的login_url参数覆盖!)

也许我应该考虑扩展user_passes_test装饰器,以便在测试失败时向响应对象添加属性?然后可以在测试中检查这一点。如果失败,我将通过检查请求的副作用是否已经发生来确定请求是否成功。这样做会起作用,但是会非常长时间的啰嗦,特别是在进行了大量的检查之后。

我无法想象我是第一个遇到这个问题的人,处理这个问题的正确方法是什么,或者我错过了什么?

非常感谢!

2 个答案:

答案 0 :(得分:1)

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

[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

答案 1 :(得分:1)

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

这样,您就可以在测试中捕获403的异常/测试,并保留重定向到登录页面。

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

将设置添加到所有permission_required装饰器可能不符合您的口味,感觉有点像您在源中添加测试代码,但这是我目前看到的唯一方式。