You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6中使用SignInManager编写单元测试遇方法未找到错误

问题解决:.NET 6中SignInManager单元测试MissingMethodException

错误原因

你遇到的System.MissingMethodException,根源是手动继承实现MockSignInManager等Identity管理器类时,构造函数签名与.NET 6框架中SignInManager<T>的实际构造逻辑不兼容,且手动传递null参数会触发框架内部的构造重载匹配失败。此外,手动编写Mock类极易受框架版本更新影响,维护成本高。

解决方案

改用Moq直接模拟Identity组件,替代自定义Mock类,彻底规避构造函数签名不匹配问题。

步骤1:重构测试类的SetUp方法

替换原有手动Mock类的实例化逻辑,用Moq创建依赖:

private ComptesController _comptesController;
private Mock<SignInManager<ApplicationUser>> _signInManagerMock;
private Mock<UserManager<ApplicationUser>> _userManagerMock;
private Mock<RoleManager<IdentityRole>> _roleManagerMock;
private Mock<IOptions<APISettings>> _aPISettings;

[SetUp]
public void SetUp()
{
    // 模拟UserManager依赖
    var userStoreMock = new Mock<IUserStore<ApplicationUser>>();
    _userManagerMock = new Mock<UserManager<ApplicationUser>>(
        userStoreMock.Object, null, null, null, null, null, null, null, null);

    // 模拟SignInManager依赖
    var contextAccessorMock = new Mock<IHttpContextAccessor>();
    var claimsFactoryMock = new Mock<IUserClaimsPrincipalFactory<ApplicationUser>>();
    var identityOptionsMock = new Mock<IOptions<IdentityOptions>>();
    var loggerMock = new Mock<ILogger<SignInManager<ApplicationUser>>>();
    var schemeProviderMock = new Mock<IAuthenticationSchemeProvider>();

    _signInManagerMock = new Mock<SignInManager<ApplicationUser>>(
        _userManagerMock.Object, 
        contextAccessorMock.Object, 
        claimsFactoryMock.Object, 
        identityOptionsMock.Object, 
        loggerMock.Object, 
        schemeProviderMock.Object);

    // 模拟RoleManager依赖
    var roleStoreMock = new Mock<IRoleStore<IdentityRole>>();
    _roleManagerMock = new Mock<RoleManager<IdentityRole>>(
        roleStoreMock.Object, 
        new List<IRoleValidator<IdentityRole>>(), 
        new UpperInvariantLookupNormalizer(), 
        new IdentityErrorDescriber(), 
        new Mock<ILogger<RoleManager<IdentityRole>>>().Object);

    // 模拟APISettings
    _aPISettings = new Mock<IOptions<APISettings>>();
    _aPISettings.Setup(a => a.Value).Returns(new APISettings());

    // 实例化控制器
    _comptesController = new ComptesController(
        _signInManagerMock.Object,
        _userManagerMock.Object,
        _roleManagerMock.Object,
        _aPISettings.Object
    );

    // 按需配置Mock方法返回值(示例:RoleExistsAsync默认返回false)
    _roleManagerMock.Setup(r => r.RoleExistsAsync(Constantes.Role_Administrateur))
                    .ReturnsAsync(false);
}

步骤2:删除自定义Mock类

移除所有手动编写的MockRoleManager、MockSignInManager、MockUserManager、MockUserStore类,完全依赖Moq实现模拟。

步骤3:按需配置Mock行为

针对不同测试场景,提前设置Mock方法的返回值,例如测试用户创建逻辑时:

// 示例:设置UserManager.CreateAsync返回成功结果
_userManagerMock.Setup(u => u.CreateAsync(It.IsAny<ApplicationUser>(), It.IsAny<string>()))
                .ReturnsAsync(IdentityResult.Success);

内容的提问来源于stack exchange,提问作者mathdx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 07:31:01