我有一个注入了 Microsoft.AspNet.Identity.UserManager 的类,并且我希望 userManager.CreateAsync(user,password) 方法返回一个 IdentityResult.Succeeded = true 的任务。但是,IdentityResult 唯一可用的构造函数是失败构造函数,它将导致 Succeeded 属性为 false。
如何创建一个具有 Succeeded == true 的 IdentityResult? IdentityResult 没有实现接口,并且 Succeeded 不是虚拟的,所以我没有看到任何通过 Rhino Mocks 创建模拟对象的明显方法(我将其用作我的模拟框架)。
我的方法执行如下操作。提供这个例子来说明为什么我可能想嘲笑这个。
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.Succeeded 为 true 时调用 someOtherDependency.DoSomethingAmazing() 。感谢您的帮助!
静态 IdentityResult.Success 属性可以工作吗? http://msdn.microsoft.com/en-us/library/microsoft.aspnet.identity.identityresult.success(v=vs.108).aspx
编辑: 要添加更多细节,您似乎想要做的是让模拟的 CreateAsync 返回一个 IdentityResult,其中 Suceeded 为 true。为此,我将从您的模拟中返回 IdentityResult.Success 。不需要模拟 IdentityResult 本身。
示例:如何设置返回成功身份结果的服务。
applicationUserManagerMock.Setup(s =>
s.CreateAsync(It.IsAny<ApplicationUser>(), It.IsAny<string>())
).ReturnsAsync(IdentityResult.Success);
要使 Succeeded 属性等于 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 的方法不同。下面我为两者提供了解决方案:
如果您使用 Microsoft.AspNet.Identity 命名空间,请 检查以下方法:
在我的示例中,我通过以下方式嘲笑了
IdentityResult.Success
:
首先,IdentityResult 有受保护的构造函数:
protected IdentityResult(bool success);
如果您可以从继承类中访问受保护的构造函数 像这样实现:
public class IdentityResultMock : IdentityResult
{
public IdentityResultMock(bool succeeded) : base(succeeded) { }
}
其次,在我的单元测试中,我将
ResetPasswordAsync()
配置为
返回如下所示的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
,可以在
继承了 IdentityResult
的类。
我们可以像下面的例子一样实现:
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
return IdentityResult.Failed(new IdentityError {
Code = "420",
Description = "User Not Found" });