我刚刚开始为代码创建单元测试。我们正在使用ASP.NET MVC 4和Owin中间件进行身份验证以及其他数据和用户数据库操作。
因此,开始时我们有几个控制器和基础控制器。在基于控制器的控制器上,我们添加了UserManager
,RoleManager
等通用代码。这些代码使用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中使用。请任何人将我放在正确的道路上,哦,如何测试这些代码?
答案 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
}