模拟问题:无法实例化类的代理:Microsoft.AspNetCore.Identity.UserManager`



我试图使用Moq创建一个单元测试,该测试测试Microsoft.AspNetCore.Identity用户管理器。我知道Moq很擅长模拟接口,但UserManager并没有接口。

这是我的代码:

Mock<UserManager<User>> userManagerMock = new Mock<UserManager<User>>();
// rest of my code ...

这是错误:

Castle.DynamicProxy.InvalidProxyConstructorArgumentsException:可以未实例化类的代理:Microsoft.AspNetCore.Identity.UserManager`1[[WebAPI.Core.Model.User,Core,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null]]。找不到无参数构造函数。

您可以使用Moq模拟类。您只需要使用有效的构造函数参数创建一个新的Mock。在您的情况下:

var userManagerMock = new Mock<UserManager<User>>(Mock.Of<IUserStore<User>>(), null, null, null, null, null, null, null, null);

当为类创建新的mock时,Moq使用该类的一个构造函数,在UserManager类中,有一个具有9个参数的构造函数:

UserManager<TUser>(IUserStore<TUser>, IOptions<IdentityOptions>, IPasswordHasher<TUser>, IEnumerable<IUserValidator<TUser>>, IEnumerable<IPasswordValidator<TUser>>, ILookupNormalizer, IdentityErrorDescriber, IServiceProvider, ILogger<UserManager<TUser>>)

唯一必需的参数是第一个,所有其他参数都可以传递null值。

现在,您可以设置任何虚拟方法或属性。

完整示例:

[TestMethod]
public void MockUserManager()
{
// Arrange
var userManagerMock = new Mock<UserManager<User>>(Mock.Of<IUserStore<User>>(), null, null, null, null, null, null, null, null);
userManagerMock.Setup(x => x.CheckPasswordAsync(It.IsAny<User>(), It.IsAny<string>())).ReturnsAsync(true);
// Act
var res = userManagerMock.Object.CheckPasswordAsync(new User(), "123456").Result;
// Assert
Assert.IsTrue(res);
}
public class User
{
}

相关内容

最新更新