Asp.net 模拟的UserManager和roleManager方法返回null

Asp.net 模拟的UserManager和roleManager方法返回null,asp.net,unit-testing,asp.net-core,moq,nunit-3.0,Asp.net,Unit Testing,Asp.net Core,Moq,Nunit 3.0,我模拟了userManager,并用返回值设置了所需的函数 然而,每当我尝试运行单元测试时,我总是得到一个假/失败的返回值,即使我设置的返回值不同 [TestCase] public async Task Verify_UserInRole_False() { var userRole = "Supervisor"; var email = "test@test.com"; var mockUserStore = new

我模拟了userManager,并用返回值设置了所需的函数

然而,每当我尝试运行单元测试时,我总是得到一个假/失败的返回值,即使我设置的返回值不同

    [TestCase]
    public async Task Verify_UserInRole_False()
    {
        var userRole = "Supervisor";
        var email = "test@test.com";

        var mockUserStore = new Mock<IUserStore<IdentityUser>>();
        var mockUserRoleStore = mockUserStore.As<IUserRoleStore<IdentityUser>>();
        var mockedUserManager = new Mock<UserManager<IdentityUser>>(new Mock<IUserStore<IdentityUser>>(mockUserRoleStore).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);


        mockedUserManager.Setup(x => x.FindByEmailAsync(email))
        .ReturnsAsync(It.Is<IdentityUser>(u => u.UserName == email));

        mockUserRoleStore.Setup(x => x.IsInRoleAsync(It.Is<IdentityUser>(u => u.UserName == email), userRole, It.IsAny<CancellationToken>()))
        .ReturnsAsync(true);

        AdminController adminController = new AdminController(hostingEnvironment, signInManager, logger, roleManager, mockedUserManager.Object);
        var actionResult = await adminController.CheckIfUserIsInRole(email, userRole);
        Assert.IsTrue(actionResult);
    }
[TestCase]
公共异步任务验证\u UserInRole\u False()
{
var userRole=“主管”;
var电子邮件=”test@test.com";
var mockUserStore=new Mock();
var mockUserRoleStore=mockUserStore.As();
var mockedUserManager=new Mock(new Mock(mockUserRoleStore).Object,
新建Mock().Object,
新建Mock().Object,
新的IUserValidator[0],
新的IPasswordValidator[0],
新建Mock().Object,
新建Mock().Object,
新建Mock().Object,
新建Mock().Object);
mockedUserManager.Setup(x=>x.findbyemailsync(电子邮件))
.ReturnsAsync(It.Is(u=>u.UserName==email));
mockUserRoleStore.Setup(x=>x.IsInRoleAsync(It.Is(u=>u.UserName==email)、userRole、It.IsAny())
.ReturnsAsync(正确);
AdminController=newadmincontroller(hostingEnvironment、signInManager、logger、roleManager、mockedUserManager.Object);
var actionResult=wait adminController.CheckIfUserIsInRole(电子邮件,用户角色);
Assert.IsTrue(actionResult);
}
测试方法:

public async Task<bool> CheckIfUserIsInRole(string email, string role)
{
    return await _userManager.IsInRoleAsync(await _userManager.FindByEmailAsync(email), role);
}
公共异步任务CheckIfUserIsInRole(字符串电子邮件,字符串角色)
{
返回await\u userManager.IsInRoleAsync(await\u userManager.findbyemailsync(email),角色);
}
用户管理器的各种方法(如AddToRole())也是如此;等

根据我的理解: 当我模拟IsInRoleAsync()时, 一旦命中CheckIfUserIsInRole(…)方法, IsInRoleAsync()应该被模拟对象替换,并且应该返回我们配置模拟对象要返回的任何内容

我做错了什么


谢谢:)

问题在于模拟的设置。如果使用特定对象或值,则
moq
将使用
IEquatable.Equals
比较实例。您有以下设置:

mockedUserManager.Setup(x => x.FindByEmailAsync(email))
    .ReturnsAsync(new IdentityUser { UserName = email });

mockUserRoleStore.Setup(x => x.IsInRoleAsync(new IdentityUser() { UserName = email }, userRole, ct))
    .ReturnsAsync(true);
由于您每次创建新实例时,您的设置从未真正匹配。考虑将第二个设置更改为:

mockUserRoleStore.Setup(x => x.IsInRoleAsync(It.IsAny<IdentityUser>(), userRole, It.IsAny<CancellationToken>()))
    .ReturnsAsync(true);

嗨,我试过这个方法;但仍然得到同样的结果;我重构了代码以帮助调试。实际函数中的userManager.findbyemailsync()返回null,这可能是问题所在;但是,不管我传递给RoleStore方法的论点是什么;它不应该给我我指示它给出的模拟返回吗?@AbhilashGopalakrishna
moq
尝试将调用与设置匹配,但在您的情况下,设置有新实例,它总是与实际调用中的实例不同。我更新了答案,又发现了一个问题。那是一个愚蠢的错误;谢谢:)在尝试了您的建议后,我已经更新了新代码。我仍然得到相同的返回值false。这可能是我犯的另一个调用错误。你能在编辑中看到任何明显的错误吗?。非常感谢:)@AbhilashGopalakrishna
.ReturnsAsync(It.Is(u=>u.UserName==email))这是错误的,因为它将实际返回null:),将其恢复到以前解决null用户问题的实现…嗨,谢谢:);我犯了一个严重的错误。:)我使用的是userManager.IsInRoleAsync,但在rolestore中模拟了IsInRoleAsync。我还没有看到usermanager如何调用IsInRoleAsync。但这似乎解决了问题;谢谢:)
mockUserRoleStore.Setup(x => x.IsInRoleAsync(It.Is<IdentityUser>(u => u.UserName == email), userRole, It.IsAny<CancellationToken>()))
    .ReturnsAsync(true);
var mockUserRoleStore = mockUserStore.As<IUserRoleStore<IdentityUser>>();
var mockedUserManager = new Mock<UserManager<IdentityUser>>(mockUserRoleStore.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);