如何使用Success == true构造IdentityResult

我有一个注入了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 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; } 

我正在尝试编写unit testing,以确保在identityResult.Succeeded为true时调用someOtherDependency.DoSomethingAmazing()。 谢谢你的帮助!

静态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本身。

要使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 } 
 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

在我的例子中,我以下列方式模拟了IdentityResult.Success

首先,IdentityResult具有受保护的构造函数:

 protected IdentityResult(bool success); 

如果你这样实现,可以从inheritance的类访问受保护的构造函数:

  public class IdentityResultMock : IdentityResult { public IdentityResultMock(bool succeeded) : base(succeeded) { } } 

其次,在我的unit testing中,我配置了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); 

基本上我实现了inheritanceIdentityResult的新类,并在我的测试用例中使用了它。