J'ai une classe avec Microsoft.AspNet.Identity.UserManager injecté, et je veux m'attendre à ce que la méthode userManager.CreateAsync (utilisateur, mot de passe) renvoie une tâche où IdentityResult.Succeeded = true. Cependant, les seuls constructeurs disponibles pour IdentityResult sont les constructeurs d'échec qui entraîneront la propriété Succeeded à false.
Comment créer un IdentityResult qui a réussi == true? IdentityResult n'implémente pas d'interface et Succeeded n'est pas virtuel, donc je ne vois aucun moyen évident de créer un objet fantaisie via Rhino Mocks (que j'utilise comme cadre de simulation).
Ma méthode fait quelque chose comme ci-dessous. Fournir cet exemple pour montrer pourquoi je pourrais vouloir me moquer de cela.
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;
}
J'essaie d'écrire un test unitaire qui garantit que someOtherDependency.DoSomethingAmazing () est appelé si identityResult.Succeeded est vrai. Merci pour toute aide!
La propriété statique IdentityResult.Success fonctionnerait-elle? http://msdn.Microsoft.com/en-us/library/Microsoft.aspnet.identity.identityresult.success (v = vs.108) .aspx
Edit : Pour ajouter plus de détails, il semble que ce que vous voulez faire est d'obtenir que votre CreateAsync simulé renvoie un IdentityResult où Suceeded est vrai. Pour cela, je voudrais simplement retourner IdentityResult.Success depuis votre maquette. Il ne devrait pas être nécessaire de se moquer du résultat IdentityResult lui-même.
Pour rendre la propriété Succeeded égale à True, utilisez l'un de ces exemples:
return IdentityResult.Success;
IdentityResult result = IdentityResult.Success;
De plus, pour que la propriété Success renvoie true
return Identity.Success;
Ensuite, dans votre code d'implémentation, appelez la méthode d'implémentation comme celle-ci
var result = await RegisterUser(newUser).Result
if(result.Succeeded)
{
//do something
}
L'approche est différente pour Microsoft.AspNet.Identity et Microsoft.AspNetCore.Identity. Ci-dessous, j'ai fourni des solutions pour les deux:
Si vous utilisez Microsoft.AspNet.Identity namespace, veuillez vérifier l'approche suivante:
Dans mon exemple, je me suis moqué de IdentityResult.Success
De la manière suivante:
Premièrement, IdentityResult a protégé le constructeur:
protected IdentityResult(bool success);
Le constructeur protégé est accessible à partir de la classe héritée si vous implémentez comme ceci:
public class IdentityResultMock : IdentityResult
{
public IdentityResultMock(bool succeeded) : base(succeeded) { }
}
Deuxièmement, dans mon test unitaire, j'ai configuré ResetPasswordAsync()
pour renvoyer identityResult comme ci-dessous:
var identityResult = new IdentityResultMock(true);
_mockUserManager.Setup(e => e.ResetPasswordAsync(user.Id, model.Code, model.Password)).ReturnsAsync(identityResult);
Troisièmement, dans l'action de mon contrôleur, ResetPasswordAsync()
retournera le résultat avec Successed == true
:
var result = await userManager.ResetPasswordAsync(user.Id, model.Code, model.Password);
Fondamentalement, j'ai implémenté une nouvelle classe qui a hérité d'IdentityResult et l'a utilisée dans mes cas de test.
Si vous utilisez l'aide de l'espace de noms Microsoft.AspNetCore.Identity, essayez l'approche suivante:
IdentityResult
dans ce cas n'a pas de constructeur protégé mais il a une propriété protégée Succeeded
accessible à l'intérieur de la classe qui a hérité IdentityResult
.
Nous pouvons réaliser comme dans l'exemple suivant:
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);
Si vous avez besoin d'un IdentityResult réussi, il vous suffit d'appeler la propriété Success. Cela vous donnera un IdentityResult réussi.
https://msdn.Microsoft.com/en-us/library/Microsoft.aspnet.identity.identityresult (v = vs.108) .aspx