C# 创建UserManager的实例<;T>;测试中
我对模拟的概念非常陌生,我很难在测试中注入/模拟C# 创建UserManager的实例<;T>;测试中,c#,testing,asp.net-core,asp.net-core-mvc,asp.net-core-identity,C#,Testing,Asp.net Core,Asp.net Core Mvc,Asp.net Core Identity,我对模拟的概念非常陌生,我很难在测试中注入/模拟UserManager 我需要使用await\u userManager.CreateAsync(用户,密码) 我找到了这个 public static UserManager<TUser> TestUserManager<TUser>(IUserStore<TUser> store = null) where TUser : class { store = store ?? new Mock<IU
UserManager
我需要使用await\u userManager.CreateAsync(用户,密码)代码>
我找到了这个
public static UserManager<TUser> TestUserManager<TUser>(IUserStore<TUser> store = null) where TUser : class
{
store = store ?? new Mock<IUserStore<TUser>>().Object;
var options = new Mock<IOptions<IdentityOptions>>();
var idOptions = new IdentityOptions();
idOptions.Lockout.AllowedForNewUsers = false;
options.Setup(o => o.Value).Returns(idOptions);
var userValidators = new List<IUserValidator<TUser>>();
var validator = new Mock<IUserValidator<TUser>>();
userValidators.Add(validator.Object);
var pwdValidators = new List<PasswordValidator<TUser>>();
pwdValidators.Add(new PasswordValidator<TUser>());
var userManager = new UserManager<TUser>(store, options.Object, new PasswordHasher<TUser>(),
userValidators, pwdValidators, new UpperInvariantLookupNormalizer(),
new IdentityErrorDescriber(), null,
new Mock<ILogger<UserManager<TUser>>>().Object);
validator.Setup(v => v.ValidateAsync(userManager, It.IsAny<TUser>()))
.Returns(Task.FromResult(IdentityResult.Success)).Verifiable();
return userManager;
}
publicstaticusermanager-TestUserManager(IUserStore-store=null),其中TUser:class
{
store=store??新建Mock().对象;
var options=newmock();
var idOptions=新标识选项();
idOptions.locket.AllowedForNewUsers=false;
options.Setup(o=>o.Value).Returns(idOptions);
var userValidators=新列表();
var validator=new Mock();
添加(validator.Object);
var pwdValidators=新列表();
添加(新的密码验证器());
var userManager=new userManager(store,options.Object,new PasswordHasher(),
UserValidator、PWDValidator、新的UpperInvariantLookupNormalizer(),
新的IdentityErrorDescriber(),null,
新建Mock().Object);
Setup(v=>v.validateSync(userManager,It.IsAny())
.Returns(Task.FromResult(IdentityResult.Success)).Verifiable();
返回userManager;
}
但这会使
System.NotSupportedException:存储未实现IUserPasswordStore
如何在测试中创建工作的UserManager
实例
我正在使用Xunit首先,我已经阅读了一些不同的论文,人们说你不需要测试已经测试过的库和工具。
但有时我们需要模拟UserManager
来注入服务并解决这些依赖关系。
UserManager
可以模拟得非常简单,但这样的错误消息并没有得到很好的解释。
我们必须首先模拟UserStore
并将其交给UserManager
,要模拟UserStore,您可以创建一个类MockUserStore
,该类派生IUserStore
和IUserPasswordStore
:
public class MockUserStore : IUserStore<TUser>, IUserPasswordStore<TUser>
毕竟,您可以通过传递mockedUserStore来模拟UserManager
:
var userStore = new MockUserStore();
var userManager = new MockUserManager(userStore,
new Mock<IOptions<IdentityOptions>>().Object,
new Mock<IPasswordHasher<AppUser>>().Object,
new IUserValidator<TUser>[0],
new IPasswordValidator<TUser>[0],
new Mock<ILookupNormalizer>().Object,
new Mock<IdentityErrorDescriber>().Object,
new Mock<IServiceProvider>().Object,
new Mock<ILogger<UserManager<TUser>>>().Object);
return userManager;
var userStore=new MockUserStore();
var userManager=new MockUserManager(userStore,
新建Mock().Object,
新建Mock().Object,
新的IUserValidator[0],
新的IPasswordValidator[0],
新建Mock().Object,
新建Mock().Object,
新建Mock().Object,
新建Mock().Object);
返回userManager;
你能再发一点代码吗?就像IUserStore和IUserPasswordStore的定义一样?这些接口来自Microsoft.AspNetCore.Identity
public class MockUserManager : UserManager<TUser>
{
public MockUserManager(IUserStore<TUser> store, IOptions<IdentityOptions> optionsAccessor,
IPasswordHasher<TUser> passwordHasher, IEnumerable<IUserValidator<TUser>> userValidators,
IEnumerable<IPasswordValidator<TUser>> passwordValidators, ILookupNormalizer keyNormalizer,
IdentityErrorDescriber errors, IServiceProvider services, ILogger<UserManager<TUser>> logger)
: base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, services, logger)
{
}
public override Task<IdentityResult> CreateAsync(TUser user)
{
return Task.FromResult(IdentityResult.Success);
}
}
var userStore = new MockUserStore();
var userManager = new MockUserManager(userStore,
new Mock<IOptions<IdentityOptions>>().Object,
new Mock<IPasswordHasher<AppUser>>().Object,
new IUserValidator<TUser>[0],
new IPasswordValidator<TUser>[0],
new Mock<ILookupNormalizer>().Object,
new Mock<IdentityErrorDescriber>().Object,
new Mock<IServiceProvider>().Object,
new Mock<ILogger<UserManager<TUser>>>().Object);
return userManager;