如何构建成功的IdentityResult==true
本文关键字:IdentityResult 成功 true 何构建 构建 | 更新日期: 2023-09-27 18:26:03
我有一个注入了Microsoft.AspNet.Identity.UserManager的类,我希望UserManager.CreateAsync(user,password)方法返回一个Task,其中IdentityResult.Sceeded=true。但是,IdentityResult的唯一可用构造函数是会导致Successed属性为false的失败构造函数。
如何创建一个成功==true的IdentityResult?IdentityResult没有实现接口,Successed也不是虚拟的,所以我看不到任何明显的方法可以通过Rhino Mocks(我将其用作我的mocking框架)创建mock对象。
我的方法如下所示。提供这个例子来说明我为什么要嘲笑它。
public async Task<IdentityResult> RegisterUser(NewUser newUser)
{
ApplicationUser newApplicationUser = new ApplicationUser()
{
UserName = newUser.UserName,
Email = newUser.Email
};
IdentityResult identityResult = await applicationUserManager.CreateAsync(newApplicationUser, newUser.Password);
if(identityResult.Succeeded)
{
someOtherDependency.DoSomethingAmazing();
}
return identityResult;
}
我正在尝试编写一个单元测试,以确保在identityResult.Sceeded为true的情况下调用someOtherDependency.DoSomethingAmazing()。谢谢你的帮助!
静态IdentityResult.Success属性是否有效?http://msdn.microsoft.com/en-us/library/microsoft.aspnet.identity.identityresult.success(v=vs.108).aspx
编辑:为了添加更多细节,您似乎想要做的是让模拟的CreateAsync返回一个IdentityResult,其中Suceed为true。为此,我只想从您的模拟中返回IdentityResult.Success。不应该需要模拟IdentityResult本身。
示例:如何设置返回成功标识结果的服务。
applicationUserManagerMock.Setup(s =>
s.CreateAsync(It.IsAny<ApplicationUser>(), It.IsAny<string>())
).ReturnsAsync(IdentityResult.Success);
要使Successed属性等于True,请使用以下任一示例:
return IdentityResult.Success;
IdentityResult result = IdentityResult.Success;
此外,要使Success属性返回true
return Identity.Success;
然后在实现代码中,调用类似的实现方法
var result = await RegisterUser(newUser).Result
if(result.Succeeded)
{
//do something
}
方法对于Microsoft.AspNet.Identity和Microsoft.AspNetCore.Identity是不同的。Bellow I为两者提供了解决方案:
-
如果您正在使用Microsoft.AspNet.Identity命名空间,请检查以下方法:
在我的例子中,我用以下方式嘲笑
IdentityResult.Success
:首先,IdentityResult具有受保护的构造函数:
protected IdentityResult(bool success);
如果您实现方式如下:
public class IdentityResultMock : IdentityResult { public IdentityResultMock(bool succeeded) : base(succeeded) { } }
其次,在单元测试中,我将
ResetPasswordAsync()
配置为return identityResult如下所示:var identityResult = new IdentityResultMock(true); _mockUserManager.Setup(e => e.ResetPasswordAsync(user.Id, model.Code, model.Password)).ReturnsAsync(identityResult);
第三,在我的控制器的操作中,
ResetPasswordAsync()
将返回Successed == true
:的结果var result = await userManager.ResetPasswordAsync(user.Id, model.Code, model.Password);
基本上,我实现了继承了IdentityResult和在我的测试用例中使用了它。
-
如果您正在使用Microsoft.AspNetCore.Identity命名空间然后尝试以下方法:
IdentityResult
在这种情况下没有受保护的构造函数,但是它具有受保护的属性Succeeded
,可以在继承CCD_ 7的类。我们可以实现如下示例:
public class IdentityResultMock : IdentityResult { public IdentityResultMock(bool succeeded = false) { this.Succeeded = succeeded; } } var result = new IdentityResultMock(true); Console.WriteLine(result.Succeeded); result.Succeeded = true; // This is not allowed! Please use constructor.
var responseTask = System.Threading.Tasks.Task.FromResult(IdentityResult.Success);
_mocAuthService.Stub(s => s.RegisterUser(null)).IgnoreArguments().Return(responseTask);
如果您需要一个成功的IdentityResult,那么您所需要做的就是调用Success属性。这将为您提供一个成功的IdentityResult。
https://msdn.microsoft.com/en-us/library/microsoft.aspnet.identity.identityresult(v=vs.108).aspx