.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
相关产品推荐
相关产品推荐

