web-dev-qa-db-ja.com

IdentityResultを成功させる方法== true

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()が呼び出されることを保証する単体テストを記述しようとしています。助けてくれてありがとう!

29
jakejgordon

静的なIdentityResult.Successプロパティは機能しますか? http://msdn.Microsoft.com/en-us/library/Microsoft.aspnet.identity.identityresult.success(v = vs.108).aspx

Edit:さらに詳細を追加するには、モックしたCreateAsyncにSuceededがtrueであるIdentityResultを返すようにすることです。そのためには、モックからIdentityResult.Successを返すだけです。 IdentityResult自体をモックする必要はありません。

44
jt000

SucceededプロパティをTrueにするには、次のいずれかの例を使用します。

return IdentityResult.Success;
IdentityResult result = IdentityResult.Success;
20
Sabel

さらに、Successプロパティがtrueを返すようにする

return Identity.Success;

次に、実装コードで、このような実装メソッドを呼び出します

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

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) { }
        }
    _

    次に、単体テストで、以下のようにidentityResultを返すようにResetPasswordAsync()を構成しました。

    _var identityResult = new IdentityResultMock(true);
    _mockUserManager.Setup(e => e.ResetPasswordAsync(user.Id, model.Code, model.Password)).ReturnsAsync(identityResult);
    _

    3番目に、コントローラーのアクションで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.
    _
2
kat1330
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

1
kingkeamo