Как протестировать пользовательский декоратор Django с разными значениями?

У меня есть представление, основанное на функциях, вот такое:

@new_group_required("special_group", raise_exception=True)
def my_view(request):
    <my code>

Я хотел бы проверить это, как если бы raise_exception был установлен на False, но я не могу понять через Google, как это сделать.

Некоторые люди рекомендуют использовать Mock, но я довольно плохо знаком с Mock и как я могу запустить my_view, но изменить только атрибут этого декоратора.

Любая помощь будет принята с благодарностью!

Код декоратора выглядит следующим образом (очень похож на встроенный Permission декоратор из Django):

def user_passes_test(
    test_func, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME
):
    """
    Decorator for views that checks that the user passes the given test,
    redirecting to the log-in page if necessary. The test should be a callable
    that takes the user object and returns True if the user passes.
    """

    def decorator(view_func):
        @wraps(view_func)
        def _wrapper_view(request, *args, **kwargs):
            if test_func(request.user):
                return view_func(request, *args, **kwargs)
            path = request.build_absolute_uri()
            resolved_login_url = resolve_url(login_url or settings.LOGIN_URL)
            # If the login url is the same scheme and net location then just
            # use the path as the "next" url.
            login_scheme, login_netloc = urlparse(resolved_login_url)[:2]
            current_scheme, current_netloc = urlparse(path)[:2]
            if (not login_scheme or login_scheme == current_scheme) and (
                not login_netloc or login_netloc == current_netloc
            ):
                path = request.get_full_path()
            from django.contrib.auth.views import redirect_to_login

            return redirect_to_login(
                path, resolved_login_url, redirect_field_name
            )

        return _wrapper_view

    return decorator


def new_group_required(group, login_url=None, raise_exception=False):
    """
    Decorator for views that checks whether a user has a particular group
    enabled, redirecting to the log-in page if necessary.
    If the raise_exception parameter is given the PermissionDenied exception
    is raised.
    """

    def check_groups(user):
        if isinstance(group, str):
            groups = (group,)
        else:
            groups = group
        # First check if the user has the group (even anon users)
        if user.has_groups(groups):
            return True
        # In case the 403 handler should be called raise the exception
        if raise_exception:
            raise PermissionDenied
        # As the last resort, show the login form
        return False

    return user_passes_test(check_groups, login_url=login_url)

В настоящее время у меня есть подобный тест с User, у которого нет Group, и он проходит. Я просто пытаюсь проверить ситуацию, когда у пользователя нет Group и убедиться, что он перенаправляет его на login_url соответствующим образом, когда raise_exception равно False.

    def test_my_view_not_accessible_to_ungrouped_users(self):
        self.client.force_login(user=self.user_without_group)
        response = self.client.get("/my_app/my_view/")
        self.assertEqual(response.status_code, 403)
Вернуться на верх