如何对功能进行了单元测试?

时间:2018-11-12 21:53:56

标签: python django unit-testing python-decorators

我有一个这样装饰的视图:

@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装饰?

我希望我可以为装饰器本身编写一组测试,然后只需要确认我要为其装饰的每个视图调用正确的组即可。

1 个答案:

答案 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_groupuser_passes_test,调用修饰的函数,测试is_user_in_group被正确的组调用,以及测试user_passes_test被调用以及is_user_in_group的模拟返回值。