• 单元测试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》
  • 相关阅读:
    select服务器模型
    网络编程-并发服务器基础
    生产者消费者模型
    readv()和write()sendfile()
    snprintf函数的用法
    struct stat结构体的简介
    half-socket
    结构体struct sockaddr_in, struct sockaddr,struct in_addr
    int main(int argc,char* argv[])的作用
    fgets和fputs,fread和fwrite,fscanf,和fprintf用法小结
  • 原文地址:https://www.cnblogs.com/zhangjiang/p/2413691.html
Copyright © 2020-2023  润新知