Search code examples
c#authenticationasp.net-identityowin

Creating instances for RoleManager and UserManager for unit testing?


I am currently trying to make a test in C# which is relied on UserManager and RoleManager. I mocked them but that did not help, additionally I got an exception which illustrates that a mock object cannot be converted to User or RoleManager.

My question is: do you have any idea how to make instances of UserManager and RoleManager without passing augments in their parameters? So that instances will be used for testing purposes?

public Object MockedUserManager()
{
    var mockUserManager = new Mock<UserManager<User>>(
    new Mock<IUserStore<User>>().Object,
    new Mock<IOptions<IdentityOptions>>().Object,
    new Mock<IPasswordHasher<User>>().Object,
    new IUserValidator<User>[0],
    new IPasswordValidator<User>[0],
    new Mock<ILookupNormalizer>().Object,
    new Mock<IdentityErrorDescriber>().Object,
    new Mock<IServiceProvider>().Object,
    new Mock<ILogger<UserManager<User>>>().Object);
    return mockUserManager.Object;
}

Thank you in advance!


Solution

  • I use this extension method, as you can notice it returns a Mock instance so you can set up any behavior that you need in the unit test.

    public static Mock<UserManager<TUser>> GetUserManagerMock<TUser>()
            where TUser: BaseCfUser
        {
            var store = new Mock<IUserStore<TUser>>();
            var userManagerMock = new Mock<UserManager<TUser>>(store.Object, null, null, null, null, null, null, null, null);
            userManagerMock.Object.UserValidators.Add(new UserValidator<TUser>());
            userManagerMock.Object.PasswordValidators.Add(new PasswordValidator<TUser>());
            return userManagerMock;
        }