在Identity Core中模拟UserManager的CreateAsync方法

时间:2019-03-15 21:54:37

标签: .net unit-testing asp.net-identity nunit moq

我正在尝试模拟userManager的CreateAsync()方法。

我正在使用ASP.Net Core 2.1。

我嘲笑了FindByNameAsync()方法。

我在其他地方读到,在Identity 2.0中,CreateAsync()方法使用ValidateAsync方法。

  • 我都嘲笑了。
  • 我不知道如何为用户管理器提供模拟的验证器作为参数。
  • 我总是收到一个错误消息,说构造函数无法识别参数。
  • 即使使用模拟的用户管理器,我的身份结果也为空。

测试用例:

    Mock<SurveyContext> mockdb = new Mock<SurveyContext>();
    var mockValidator = new Mock<IUserValidator<IdentityUser>>();
    mockValidator.Setup(x => x.ValidateAsync(It.IsIn<UserManager<IdentityUser>>(), It.IsAny<IdentityUser>())).Returns(Task.FromResult(IdentityResult.Success));
    var mockUserStore = new Mock<IUserStore<IdentityUser>>();
    var mockUserRoleStore = mockUserStore.As<IUserRoleStore<IdentityUser>>();
    var mockUserManager = new Mock<UserManager<IdentityUser>>(mockUserStore.Object,
            new Mock<IOptions<IdentityOptions>>().Object,
            new Mock<IPasswordHasher<IdentityUser>>().Object,
            new IUserValidator<IdentityUser>[0],
            new IPasswordValidator<IdentityUser>[0],
            new Mock<ILookupNormalizer>().Object,
            new Mock<IdentityErrorDescriber>().Object,
            new Mock<IServiceProvider>().Object,
            new Mock<ILogger<UserManager<IdentityUser>>>().Object);


    var mockRoleStore = new Mock<IRoleStore<IdentityRole>>();
    var mockRoleManager = new Mock<RoleManager<IdentityRole>>(
                 mockRoleStore.Object, null, null, null, null);

    mockdb.Setup(x => x.Add(addMember)).Returns((Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry<MemberInfo>)null);
    mockdb.Setup(x => x.SaveChanges()).Returns(0);
    mockUserManager.Setup(x => x.CreateAsync(It.IsAny<IdentityUser>(), "password")).Returns(Task.FromResult(IdentityResult.Success));

    mockUserManager.Setup(x => x.FindByNameAsync(It.IsAny<string>()))
     .Returns(Task.FromResult(It.IsAny<IdentityUser>()));


    mockUserManager.Setup(x => x.AddToRoleAsync(new IdentityUser()
    {
        UserName = "username"

    }, "password")).Returns(Task.FromResult(IdentityResult.Success));
    mockRoleManager.Setup(x => x.RoleExistsAsync("")).ReturnsAsync(true);
    mockRoleManager.Setup(x => x.CreateAsync(new IdentityRole())).Returns(Task.FromResult(IdentityResult.Success));
  

每当我使用与预期相反的createasync方法时   我得到的结果为空。

我在做什么错了?

0 个答案:

没有答案