【问题标题】:How to mock ApplicationUserManager from AccountController in MVC5如何在 MVC5 中从 AccountController 模拟 ApplicationUserManager
【发布时间】:2015-02-09 08:59:02
【问题描述】:

我正在尝试为 AccountController 的注册方法编写单元测试

我正在使用最小起订量,从单元测试中模拟 ApplicationUserManager、ApplicationRoleManager 和 ApplicationSignInManager 的正确方法是什么。

public AccountController(ApplicationUserManager userManager, ApplicationRoleManager roleManager, ApplicationSignInManager signInManager)
{
    UserManager = userManager;
    RoleManager = roleManager;
    SignInManager = signInManager;

}

public ApplicationUserManager UserManager
    {
        get
        {
            return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
        private set
        {
            _userManager = value;
        }
    }

private ApplicationSignInManager _signInManager;
    public ApplicationSignInManager SignInManager
    {
        get
        {
            return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
        }
        private set { _signInManager = value; }
    }

private ApplicationRoleManager _roleManager;
    public ApplicationRoleManager RoleManager
    {
        get
        {
            return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>();
        }
        set 
        {
            _roleManager = value;
        }
    }

【问题讨论】:

    标签: asp.net-mvc unit-testing asp.net-mvc-5 moq asp.net-identity


    【解决方案1】:

    这可能不是你所需要的,但是看看,也许你会明白的。

    AccountController.cs

    [HttpGet]
    [Route("register")]
    [AllowAnonymous]
    public ActionResult Register()
    {
        if (IsUserAuthenticated)
        {
            return RedirectToAction("Index", "Home");
        }
        return View();
    }
    
    public bool IsUserAuthenticated
    {
        get 
        { 
            return
            System.Web.HttpContext.Current.User.Identity.IsAuthenticated; 
        }
    }
    

    AccountControllerTests.cs

    [Test]
    public void GET__Register_UserLoggedIn_RedirectsToHomeIndex()
    {
        // Arrange
        HttpContext.Current = CreateHttpContext(userLoggedIn: true);
        var userStore = new Mock<IUserStore<ApplicationUser>>();
        var userManager = new Mock<ApplicationUserManager>(userStore.Object);
        var authenticationManager = new Mock<IAuthenticationManager>();
        var signInManager = new Mock<ApplicationSignInManager>(userManager.Object, authenticationManager.Object);
    
        var accountController = new AccountController(
            userManager.Object, signInManager.Object, authenticationManager.Object);
    
        // Act
        var result = accountController.Register();
    
        // Assert
        Assert.That(result, Is.TypeOf<RedirectToRouteResult>());
    }
    
    [Test]
    public void GET__Register_UserLoggedOut_ReturnsView()
    {
        // Arrange
        HttpContext.Current = CreateHttpContext(userLoggedIn: false);
        var userStore = new Mock<IUserStore<ApplicationUser>>();
        var userManager = new Mock<ApplicationUserManager>(userStore.Object);
        var authenticationManager = new Mock<IAuthenticationManager>();
        var signInManager = new Mock<ApplicationSignInManager>(userManager.Object, authenticationManager.Object);
    
        var accountController = new AccountController(
            userManager.Object, signInManager.Object, authenticationManager.Object);
    
        // Act
        var result = accountController.Register();
    
        // Assert
        Assert.That(result, Is.TypeOf<ViewResult>());
    }
    
    private static HttpContext CreateHttpContext(bool userLoggedIn)
    {
        var httpContext = new HttpContext(
            new HttpRequest(string.Empty, "http://sample.com", string.Empty),
            new HttpResponse(new StringWriter())
        )
        {
            User = userLoggedIn
                ? new GenericPrincipal(new GenericIdentity("userName"), new string[0])
                : new GenericPrincipal(new GenericIdentity(string.Empty), new string[0])
        };
    
        return httpContext;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-01-09
      • 2017-03-02
      • 1970-01-01
      • 2014-09-10
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      相关资源
      最近更新 更多