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》
  • 相关阅读:
    DDD之3实体和值对象
    DDD之2领域概念
    DDD之1微服务设计为什么选择DDD
    SOFA入门
    COLA的扩展性使用和源码研究
    kafka可插拔增强如何实现?
    请设计一个核心功能稳定适合二开扩展的软件系统
    如何保证kafka消息不丢失
    kafka高吞吐量之消息压缩
    kafka消息分区机制原理
  • 原文地址:https://www.cnblogs.com/zhangjiang/p/2413691.html
Copyright © 2011-2022 走看看