如何构造 IdentityResult 且成功 == true

问题描述 投票:0回答:6

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

c# asp.net-identity rhino-mocks
6个回答
61
投票

静态 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);

24
投票

要使 Succeeded 属性等于 True,请使用以下示例之一:

return IdentityResult.Success;
IdentityResult result = IdentityResult.Success;

4
投票

更进一步,要让Success属性返回true

return Identity.Success;

然后在你的实现代码中,像这样调用实现方法

var result = await RegisterUser(newUser).Result
if(result.Succeeded)
{
  //do something
}

4
投票

Microsoft.AspNet.IdentityMicrosoft.AspNetCore.Identity 的方法不同。下面我为两者提供了解决方案:

  1. 如果您使用 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 的新类 在我的测试用例中使用了它。

  2. 如果您使用的是 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.
    

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


0
投票
            return IdentityResult.Failed(new IdentityError { 
                Code = "420",
                Description = "User Not Found" });
© www.soinside.com 2019 - 2024. All rights reserved.