如何从 AuthorizationFilterAttribute 重构出 HttpContext 以进行测试?

How do I refactor out HttpContext from AuthorizationFilterAttribute for testing?

我看到了这段代码,但由于它引用了 HttpContext,所以无法对其进行测试。如何删除对 HttpContext 的依赖以使其可测试?

public class AuthorizeByUserStatus :AuthorizationFilterAttribute
{
    private readonly UserStatusEnum status;

    public AuthorizeByUserStatus(UserStatusEnum status)
    {
        this.status = status;
    }

    public override async Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
    {
        var authorize = false;
        var user = HttpContext.Current.User;
        var userIdentity = user.GetIdentity();

        if (userIdentity.UserStatus >= status)
        {
            authorize = true;
        }

        if (authorize)
        {
            base.OnAuthorization(actionContext);
        }
        else
        {
            throw new HttpResponseException(HttpStatusCode.Unauthorized);
        }
    }
}

替换静态HttpContext方法并引用传入的actionContext,其中包含我们需要的信息!

var userIdentity = actionContext.RequestContext.Principal.GetIdentity();

您现在可以传入带有正确设置的请求详细信息的 actionContext 以获取请求用户的身份。