如何在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
制作包装器
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().