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

时间:2014-05-07 22:00:12

标签: c# testing tdd ninject

我对测试非常陌生,刚刚开始并且想知道如何让我的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;
    }
}

2 个答案:

答案 0 :(得分:1)

虽然HttpContext没有interfacce IHttpContext,但它确实有一个抽象基类HttpContextBase,您可以将其用于模拟。

MSDN documentation for HttpContextBase

就个人而言,我更喜欢单独注入HttpRequestBaseHttpResponseBase,因此模仿的次数较少(当然取决于您的方法)。

答案 1 :(得分:1)

这是将当前上下文作为参与者参数注入的方式。

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