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》
  • 相关阅读:
    工具类-ApplicationContextUtil
    银行联行号-全国地区码
    银行联行号-银行编码(联行号前3位)
    前端防止 JS 调试技巧
    Vue基础框架
    关于5G手机使用4G套餐扫盲
    nginx高级-前端必会
    懒人npm运行和打包命令
    关于虚拟专用网络的一些经验
    JS加密解密
  • 原文地址:https://www.cnblogs.com/zhangjiang/p/2413691.html
Copyright © 2011-2022 走看看