为RoleManager和UserManager创建实例以进行单元测试吗?

时间:2019-07-31 13:15:39

标签: c# authentication asp.net-identity owin

我目前正在尝试使用C#进行测试,该测试依赖于UserManager和RoleManager。我嘲笑了它们,但没有帮助,另外,我得到了一个异常,该异常说明无法将模拟对象转换为User或RoleManager。

我的问题是:您是否知道如何在不传递参数的情况下制作UserManager和RoleManager的实例?以便将实例用于测试目的?

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

提前谢谢!

1 个答案:

答案 0 :(得分:0)

我使用这种扩展方法,因为您会注意到它返回了一个Mock实例,因此您可以设置单元测试中需要的任何行为。

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;
    }
相关问题