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()が呼び出されることを保証する単体テストを記述しようとしています。助けてくれてありがとう!
静的な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自体をモックする必要はありません。
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
}
Microsoft.AspNet.IdentityとMicrosoft.AspNetCore.Identityのアプローチは異なります。以下の両方のソリューションを提供しました:
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を継承する新しいクラスを実装し、それをテストケースで使用しました。
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.
_
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