如何使用Success == true构造IdentityResult

时间:2014-10-09 01:49:24

标签: c# asp.net-identity rhino-mocks

我有一个注入了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()。谢谢你的帮助!

5 个答案:

答案 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