我有一个注入了Microsoft.AspNet.Identity.UserManager的类,我希望userManager.CreateAsync(user,password)方法返回一个IdentityResult.Succeeded = true的Task。但是,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()。谢谢你的帮助!
答案 0 :(得分:41)
静态IdentityResult.Success属性是否有效? http://msdn.microsoft.com/en-us/library/microsoft.aspnet.identity.identityresult.success(v=vs.108).aspx
修改强>: 要添加更多细节,您似乎要做的是让您的模拟CreateAsync返回Suceeded为true的IdentityResult。为此,我将从您的模拟中返回IdentityResult.Success。不应该嘲笑IdentityResult本身。
答案 1 :(得分:17)
要使Succeeded属性等于True,请使用以下任一示例:
return IdentityResult.Success;
IdentityResult result = IdentityResult.Success;
答案 2 :(得分:4)
此外,要使Success属性返回true
return Identity.Success;
然后在您的实现代码中,调用类似
的实现方法var result = await RegisterUser(newUser).Result
if(result.Succeeded)
{
//do something
}
答案 3 :(得分:2)
在我的例子中,我以下列方式嘲笑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的新类,并在我的测试用例中使用了它。
答案 4 :(得分:1)
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