How to mock ApplicationUserManager from AccountCon

2019-04-10 16:34发布

问题:

I am trying to write Unit Test for Register Method at AccountController

I am using moq and what is the correct way to mock ApplicationUserManager, ApplicationRoleManager and ApplicationSignInManager from Unit Test.

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;
        }
    }

回答1:

That is probably not exactly what you need, but take a look, maybe you'll get the idea.

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;
}