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

Creating instances for RoleManager and UserManager for unit testing?

我目前正在尝试使用依赖于 UserManager 和 RoleManager 的 C# 进行测试。我嘲笑了他们,但这没有帮助,另外我得到一个异常,说明模拟对象不能转换为 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;
}

提前致谢!

我使用了这个扩展方法,你可以注意到它returns一个 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;
    }