zoukankan      html  css  js  c++  java
  • 单元测试MVC Controller时如何模拟FormsAuthentication

    假如你的Controller里面包含如下代码

     public ActionResult Register(RegisterModel model)
    {
    ......................

    if (createStatus == MembershipCreateStatus.Success)
    {
    FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
    return RedirectToAction("Index", "Home");
    }
    return View(model);
    }

    在单元测试时候,红色那部分会抛异常。造成测试不便的原因是违反了SoC(separation of concern)原则。注册逻辑和登录逻辑混在一起。解决方案是将登录逻辑提取出来。

     public interface IAuthProvider
    {
    void SetAuthCookie(string userName, bool createPersistentCookie);
    }

    public class FormsAuthProvider : IAuthProvider
    {

    public void SetAuthCookie(string userName, bool createPersistentCookie)
    {
    FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
    }
    }
    public ActionResult Register(RegisterModel model)
    {

    if (createStatus == MembershipCreateStatus.Success)
    {
    this.authProvider.SetAuthCookie(model.UserName, false /* createPersistentCookie */);
    return RedirectToAction("Index", "Home");
    }
    else
    {
    ModelState.AddModelError("", ErrorCodeToString(createStatus));
    }
    }

    // If we got this far, something failed, redisplay form
    return View(model);
    }
    在测试时候用Moq去模拟FormsAuthentication,代码如下:
     public void RegisterTest()
    {
    Mock<IAuthProvider> mock = new Mock<IAuthProvider>();
    mock.Setup(m => m.SetAuthCookie("admin", false));

    var controller = new AccountController(mock.Object);
    var result = (RedirectToRouteResult)controller.Register(model);
    Assert.AreEqual("Index", result.RouteValues["action"]);
    ;
    }
    
    
    该方案来源于《Pro ASP.NET MVC 3 Framework》
  • 相关阅读:
    结婚也可以2.0!
    最近读书清单
    Win7旗舰版中的IIS配置asp.net的运行环境
    Google Chrome浏览器
    MySQL到NoSQL:数据的重思和查询方式的转换
    sqlserver游标概念与实例全面解说
    高效管理ASP.NET的JavaScript库
    如何提取网页中的flash
    如何手动启动tomcat
    tomcat单词缩写
  • 原文地址:https://www.cnblogs.com/zhangjiang/p/2413691.html
Copyright © 2011-2022 走看看