Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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会创建一个用户,但密码哈希属性为空_C#_Unit Testing_.net Core_Asp.net Identity_Moq - Fatal编程技术网

C# 测试usermanager会创建一个用户,但密码哈希属性为空

C# 测试usermanager会创建一个用户,但密码哈希属性为空,c#,unit-testing,.net-core,asp.net-identity,moq,C#,Unit Testing,.net Core,Asp.net Identity,Moq,我正在使用Microsoft.AspNetCore.Identity.UserManager,并试图模拟创建新用户。事实上,它确实使用用户名、电子邮件等创建了一个新用户,但密码哈希属性仍然为空 这是我如何通过一些附加设置设置mock usermanager的: var store = new Mock<IUserPasswordStore<User>>(); var validator = new UserValidator<Use

我正在使用Microsoft.AspNetCore.Identity.UserManager,并试图模拟创建新用户。事实上,它确实使用用户名、电子邮件等创建了一个新用户,但密码哈希属性仍然为空

这是我如何通过一些附加设置设置mock usermanager的:

        var store = new Mock<IUserPasswordStore<User>>();

        var validator = new UserValidator<User>();
        var passValidator = new PasswordValidator<User>();

        var mgr = new Mock<UserManager<User>>(store.Object, null, null, null, null, null, null, null, null);
        mgr.Object.UserValidators.Add(validator);
        mgr.Object.PasswordValidators.Add(passValidator);
        mgr.Object.PasswordHasher = new PasswordHasher<User>();
        mgr.Object.Options = AuthenticationRules.DefaultAuthenticationRules();

        List<User> users= new List<User>();

        mgr.Setup(x => x.DeleteAsync(It.IsAny<User>())).ReturnsAsync(IdentityResult.Success);
        mgr.Setup(x => x.CreateAsync(It.IsAny<User>(), It.IsAny<string>())).ReturnsAsync(IdentityResult.Success).Callback<User, string>((x, y) => users.Add(x));
        mgr.Setup(x => x.UpdateAsync(It.IsAny<User>())).ReturnsAsync(IdentityResult.Success);
然后,我将mgr.Object传递给一个方法,该方法处理新用户的创建,其中“Object”是\u userManager

        var creationResult = await _userManager.CreateAsync(_user, _registrationModel.Password);

        if (!creationResult.Succeeded)
            return false;

        return true;
_注册模型。已填充密码

因此,现在当安装程序在回调中向用户列表添加新用户时,用户将在不使用密码哈希的情况下填充。我不太确定我错过了什么。经理设置中缺少一些内容


提前感谢您的回调函数
回调((x,y)=>users.Add(x))将在测试完成后执行,它将接受传递给模拟方法的相同的参数值作为参数,在您的情况下,密码可能是空字符串或null

_注册模型。已填充密码

好的,但是生成一些密码的内部代码对
(x,y)=>{..}
参数没有任何影响

请参阅此代码(从“伟大的答案”中复制):

公共接口IFoo
{
内栏(布尔b);
}
var mock=new mock();
mock.Setup(mc=>mc.Bar(It.IsAny()))
.Callback(b=>Console.WriteLine(“用“+b”调用的条))
.报税表(99999);
var ret1=mock.Object.Bar(true);
控制台写入线(“结果ret1:+ret1”);
var ret2=mock.Object.Bar(false);
控制台写入线(“结果ret2:+ret2”);
//输出:
//结果ret1:正确。
//结果ret1:错误。

在本例中,无论在
Bar
方法中发生了什么,输出将仅取决于模拟函数的调用参数值。

只是想知道单元测试Identity框架的好处是什么?我很确定他们已经为你测试过这种行为。当然,除非您正在实现自己的密码哈希器。如果您热衷于模拟,Autofixture是一个很好的解决方案。@Dennis1679-它是允许注册用户的api请求的一部分。因此,它应该作为测试的一部分进行测试,以确保得到正确的响应back@maxspan-我能举个链接示例吗?啊,是的,你是对的。我正在传递带有用户名、电子邮件、密码等的registrationModel,但当我将该模型映射到实体时,“用户”实体passwordHash为空(原因是我不想用公开的密码填充passwordHash prop)我希望createAsync根据registrationModel中的密码创建一个哈希密码。但我不确定从测试的角度来看,实现这一目标的最佳方式是什么,有什么想法吗?答案取决于你的目标是什么,你想测试什么?我建议你适当地更新你的问题,或者提出另一个问题,这样我就能够提供帮助
        var creationResult = await _userManager.CreateAsync(_user, _registrationModel.Password);

        if (!creationResult.Succeeded)
            return false;

        return true;
public interface IFoo
{
    int Bar(bool b);
}

var mock = new Mock<IFoo>();

mock.Setup(mc => mc.Bar(It.IsAny<bool>()))
    .Callback<bool>(b => Console.WriteLine("Bar called with: " + b))
    .Returns(99999);

var ret1 = mock.Object.Bar(true);
Console.WriteLine("Result ret1: " + ret1);
var ret2 = mock.Object.Bar(false);
Console.WriteLine("Result ret2: " + ret2);

//OUTPUT:
//Result ret1: true.
//Result ret1: false.