依赖注入和HttpContext.Current?如何使这个类可测试

本文关键字:何使这 测试 注入 HttpContext Current 依赖 | 更新日期: 2023-09-27 18:02:10

我对测试非常陌生,刚刚开始,想知道如何使我的AuthorizationService可测试。

原因是我不能使用Ninject注入HttpContext.Current.Request到我的AuthorizationService(IHttpContext context),因为它没有接口。

我该怎么做?

代码
public class AuthorizationService : IAuthorizationService
{
    private readonly string _token;
    public AuthorizationService()
    {
        var headerValues = HttpContext.Current.Request.Headers.GetValues("Token");
        var paramValues = HttpContext.Current.Request.QueryString.GetValues("Token");
        var headerToken = string.Empty;
        var paramToken = string.Empty;
        // ... some logic ...
        this._token = headerToken;
    }
    /// <summary>
    /// Just some random function that will return the token
    /// </summary>
    /// <returns></returns>
    public string GetToken()
    {
        return this._token;
    }
}

依赖注入和HttpContext.Current?如何使这个类可测试

虽然HttpContext没有接口IHttpContext,但它有一个抽象基类HttpContextBase,您可以使用它来模拟。

HttpContextBase的MSDN文档

我个人更喜欢单独注入HttpRequestBaseHttpResponseBase,这样就可以少模仿(当然取决于你的方法)。

这是如何注入当前上下文作为贡献者参数。

kernel.Bind<IAuthorizationService>()
    .To<AuthorizationService>()
    .WithConstructorArgument("context", x => HttpContext.Current.Request);