单元测试HttpContext.GetOwinContext()

时间:2018-06-25 10:26:47

标签: c# asp.net unit-testing owin

我刚刚开始为代码创建单元测试。我们正在使用ASP.NET MVC 4和Owin中间件进行身份验证以及其他数据和用户数据库操作。

因此,开始时我们有几个控制器和基础控制器。在基于控制器的控制器上,我们添加了UserManagerRoleManager等通用代码。这些代码使用HttpContext.GetOwinContext。在其中一个控制器上执行单元测试时,我需要为当前正在努力执行的基本控制器创建单元测试。

代码如下:

protected IAuditRepository Audit
{
    get { return _audit ?? (_audit = DependencyResolver.Current.GetService<IAuditRepository>()); }
}

protected UserManager UserManager
{
    get { return HttpContext.GetOwinContext().GetUserManager<UserManager>(); }
}

因此,我对如何测试HttpContext.GetOwinContext进行了研究,但是我所看到的大部分内容仍然不清楚,并且无法为我提供能够创建测试的大量信息。

我尝试成功使用Moq进行依赖注入,但是我无法在HttpContext中使用。请任何人将我放在正确的道路上,哦,如何测试这些代码?

1 个答案:

答案 0 :(得分:3)

您知道,单元测试可帮助您重构代码。

您到达的程度是您看到您的代码已耦合,并且您依赖于HttpContext(呼吸缓慢,敌人在您的面前,但是您很快就会顺利击败他)

现在,您有一个有关如何重构它的提示。将 UserManager 设置为依赖项,然后将其注入控制器的构造函数中。

然后,您将能够模拟它,并最终获得一种耦合程度更低的解决方案。

您还将很快看到AuditManager是通过Service Locator进行良好检索的。这会让您感到运行时错误。更好的方法是也将其注入。

这是单元测试的魔力所在!

public class CustomController:BaseController /*Maybe you dont need BaseController anymore if it only provides you dependencies*/
{  
    protected UserManager _userManager{get;} //equals to readonly
    protected AuditManager _auditManager {get;} //equals to readonly

   public CustomController(IAuditManager auditManager,UserManager userManager)
   {
       _userManager=userManager;
       _auditManager=auditManager;
   }

}



//Unit test
[Test]
public void CustomController_WithMockedUserManager_IsAbleToTest()
{
      CustomController = new CustomController( yourMockedUserManager, yourMockedAuditManager);
     //Asserts...etc

}