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

Posted

技术标签:

【中文标题】模拟问题:无法实例化类的代理:Microsoft.AspNetCore.Identity.UserManager`【英文标题】:Mocking issue: Can not instantiate proxy of class: Microsoft.AspNetCore.Identity.UserManager` 【发布时间】:2022-01-20 22:57:07 【问题描述】:

我正在尝试使用 Moq 创建一个单元测试来测试 Microsoft.AspNetCore.Identity 用户管理器。我知道 Moq 很适合模拟接口,但 UserManager 没有接口。

这是我的代码:

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

这是错误:

Castle.DynamicProxy.InvalidProxyConstructorArgumentsException : Can not instantiate proxy of class: Microsoft.AspNetCore.Identity.UserManager`1[[WebAPI.Core.Model.User, Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].
Could not find a parameterless constructor.

【问题讨论】:

能否提供具体的代码示例?或者你可以先看看这个帖子,可能对你有帮助:***.com/questions/48189741/mocking-a-signinmanager 看起来UserManager&lt;User&gt; 没有无参数构造函数。如果你想模拟一个具体的类,它应该有一个无参数的构造函数。否则,你应该模拟它的一个接口。 【参考方案1】:

您可以使用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


【讨论】:

以上是关于模拟问题:无法实例化类的代理:Microsoft.AspNetCore.Identity.UserManager`的主要内容,如果未能解决你的问题,请参考以下文章

Java模拟顶级静态类

如何正确模拟实例化类变量的函数?

在 Python 中实例化类的区别

在Java中获取参数化类的实例[重复]

具有静态(内联)方法的从未实例化类的基类

如何在 javascript 中调用实例化类的函数?