如何构建成功的IdentityResult==true

本文关键字:IdentityResult 成功 true 何构建 构建 | 更新日期: 2023-09-27 18:26:03

我有一个注入了Microsoft.AspNet.Identity.UserManager的类,我希望UserManager.CreateAsync(user,password)方法返回一个Task,其中IdentityResult.Sceeded=true。但是,IdentityResult的唯一可用构造函数是会导致Successed属性为false的失败构造函数。

如何创建一个成功==true的IdentityResult?IdentityResult没有实现接口,Successed也不是虚拟的,所以我看不到任何明显的方法可以通过Rhino Mocks(我将其用作我的mocking框架)创建mock对象。

我的方法如下所示。提供这个例子来说明我为什么要嘲笑它。

  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.Sceeded为true的情况下调用someOtherDependency.DoSomethingAmazing()。谢谢你的帮助!

如何构建成功的IdentityResult==true

静态IdentityResult.Success属性是否有效?http://msdn.microsoft.com/en-us/library/microsoft.aspnet.identity.identityresult.success(v=vs.108).aspx

编辑:为了添加更多细节,您似乎想要做的是让模拟的CreateAsync返回一个IdentityResult,其中Suceed为true。为此,我只想从您的模拟中返回IdentityResult.Success。不应该需要模拟IdentityResult本身。

示例:如何设置返回成功标识结果的服务。

    applicationUserManagerMock.Setup(s => 
        s.CreateAsync(It.IsAny<ApplicationUser>(), It.IsAny<string>())
    ).ReturnsAsync(IdentityResult.Success);

要使Successed属性等于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.IdentityMicrosoft.AspNetCore.Identity是不同的。Bellow I为两者提供了解决方案:

  1. 如果您正在使用Microsoft.AspNet.Identity命名空间,请检查以下方法:

    在我的例子中,我用以下方式嘲笑IdentityResult.Success

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

    protected IdentityResult(bool success);
    

    如果您实现方式如下:

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

    其次,在单元测试中,我将ResetPasswordAsync()配置为return 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,可以在继承CCD_ 7的类。

    我们可以实现如下示例:

    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