Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建UserManager的实例<;T>;测试中_C#_Testing_Asp.net Core_Asp.net Core Mvc_Asp.net Core Identity - Fatal编程技术网

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>
毕竟,您可以通过传递mocked
UserStore来模拟
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;