如何模拟UserManager.GetRoles()

本文关键字:UserManager GetRoles 何模拟 模拟 | 更新日期: 2023-09-27 18:22:50

如何在ASP.NET Identity中模拟UserManager.GetRoles()?我知道这是一个扩展方法,所以我不能直接模拟它,也找不到需要模拟的底层方法/属性。

在过去,我可以通过模拟UserStore、来模拟扩展方法UserManager.FindByName()

var mockUserStore = new Mock<IUserStore<ApplicationUser>>();
mockUserStore.Setup(x => x.FindByNameAsync(username))
                     .ReturnsAsync(new ApplicationUser() { OrganizationId = orgId });
var userManager = new ApplicationUserManager(mockUserStore.Object);

我看不出有任何方法可以将角色分配给UserStore中的用户。有什么想法吗?

我也尝试过,但不会编译,因为UserManager.GetRoles()是一个扩展方法。我收到以下错误:"'Microsoft.AspNet.Identity.UserManager'不包含'GetRoles'的定义"

public interface IApplicationUserManager
{
    IList<string> GetRoles<TUser, TKey>(TKey userId)
        where TUser : class, IUser<TKey>
        where TKey : IEquatable<TKey>;
}
public class ApplicationUserManager : UserManager<ApplicationUser>, IApplicationUserManager
{
    public ApplicationUserManager(IUserStore<ApplicationUser> store)
        : base(store)
    {
    }
    public IList<string> GetRoles<TUser, TKey>(TKey userId)
        where TUser : class, IUser<TKey>
        where TKey : IEquatable<TKey>
    {
        return base.GetRoles(userId);
    }
}

如何模拟UserManager.GetRoles()

您可以为UserManager 制作包装器

interface IUserManagerWrapper 
{
     roles GetRoles ();
}
public class MyUserManager : IUserManagerWrapper 
{
      GetRoles () 
    {
         return UserManager.GetRoles()
    }
}

并且使用IUserManagerWrapper而不是UserManager.GetRoles(),因此您可以模拟它。

我最终为ApplicationUserManager提取了一个包含GetRoles的接口。然后,我将GetRoles()添加到ApplicationUserManager中,它调用扩展方法类。

public interface IApplicationUserManager
{
    IList<string> GetRoles(string userId);
}
public class ApplicationUserManager : UserManager<ApplicationUser>, IApplicationUserManager
{
    public ApplicationUserManager(IUserStore<ApplicationUser> store)
        : base(store)
    {
    }
    public IList<string> GetRoles(string userId)
    {
        return UserManagerExtensions.GetRoles(manager: this, userId: userId);
    }
}

现在我可以模拟IApplicationUserManager.GetRoles().