我有一个这样装饰的视图:
@check_has_permission('is_manager')
def view():
pass
装饰器看起来像这样:
def check_has_permission(group=None):
def can_user_access(user):
if user.is_authenticated():
if group == 'is_staff':
return user.is_staff()
elif group == 'is_admin':
return (
user.is_admin() or
user.is_staff()
)
elif group == 'is_manager':
return (
user.is_manager() or
user.is_admin() or
user.is_staff()
)
return False
return user_passes_test(can_user_access, login_url=login_url)
我该如何编写单元测试以确认视图是否由带有一组is_manager的check_has_permission装饰?
我希望我可以为装饰器本身编写一组测试,然后只需要确认我要为其装饰的每个视图调用正确的组即可。
答案 0 :(得分:2)
您需要添加一个 seam 以便进行测试。
如果您的装饰器看起来像这样:
def is_user_in_group(group):
if user.is_authenticated():
# ... snip - checks on groups and user ...
return False
def check_has_permission(group=None):
def can_user_access(user):
return is_user_in_group(user, group)
return user_passes_test(can_user_access, login_url=login_url)
然后,您的测试可以模拟is_user_in_group
和user_passes_test
,调用修饰的函数,测试is_user_in_group
被正确的组调用,以及测试user_passes_test
被调用以及is_user_in_group
的模拟返回值。