pruebas - unit test rest api c#
Cómo construir IdentityResult With Success== true (5)
Tengo una clase con Microsoft.AspNet.Identity.UserManager inyectado, y quiero esperar que el método userManager.CreateAsync (usuario, contraseña) devuelva una Tarea donde IdentityResult.Succeeded = true. Sin embargo, los únicos constructores disponibles para IdentityResult son los constructores de fallas que harán que la propiedad Succeeded sea falsa.
¿Cómo se crea un resultado de identidad que ha tenido éxito == verdadero? IdentityResult no implementa una interfaz y Succeeded no es virtual, por lo que no veo ninguna forma obvia de crear un objeto simulado a través de Rhino Mocks (que estoy usando como mi marco de simulación).
Mi método hace algo como el siguiente. Proporcionando este ejemplo para mostrar por qué me gustaría burlarme de esto.
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;
}
Estoy tratando de escribir una prueba de unidad que garantice que se llame a SomeOtherDependency.DoSomethingAmazing () si identityResult.Succeeded es true. ¡Gracias por cualquier ayuda!
¿Funcionaría la propiedad IdentityResult.Success estática? http://msdn.microsoft.com/en-us/library/microsoft.aspnet.identity.identityresult.success(v=vs.108).aspx
Edición : para agregar más detalles, parece que lo que quieres hacer es obtener tu CreateAsync burlado para devolver un IdentityResult donde Suceeded es verdadero. Para eso, solo devolvería IdentityResult.Consulta el éxito de tu simulacro. No debería haber ninguna necesidad de burlarse del mismo IdentityResult.
Además, para que la propiedad Success se vuelva verdadera
return Identity.Success;
Luego, en su código de implementación, llame al método de implementación como este
var result = await RegisterUser(newUser).Result
if(result.Succeeded)
{
//do something
}
En mi ejemplo me burlé de IdentityResult.Success
de la siguiente manera:
Primero, IdentityResult ha protegido al constructor:
protected IdentityResult(bool success);
Se puede acceder al constructor protegido desde la clase heredada si implementa así:
public class IdentityResultMock : IdentityResult
{
public IdentityResultMock(bool succeeded) : base(succeeded) { }
}
Segundo, en mi prueba de unidad configuré ResetPasswordAsync()
para devolver identityResult como a continuación:
var identityResult = new IdentityResultMock(true);
_mockUserManager.Setup(e => e.ResetPasswordAsync(user.Id, model.Code, model.Password)).ReturnsAsync(identityResult);
Tercero, en la acción de mi controlador, ResetPasswordAsync()
devolverá el resultado con Successed == true
:
var result = await userManager.ResetPasswordAsync(user.Id, model.Code, model.Password);
Básicamente implementé una nueva clase que heredó IdentityResult y la usé en mis casos de prueba.
Para hacer que la propiedad Succeeded sea igual a True, use cualquiera de estos ejemplos:
return IdentityResult.Success;
IdentityResult result = IdentityResult.Success;
var responseTask = System.Threading.Tasks.Task.FromResult(IdentityResult.Success);
_mocAuthService.Stub(s => s.RegisterUser(null)).IgnoreArguments().Return(responseTask);
Si necesita un IdentityResult exitoso, todo lo que necesita hacer es llamar a la propiedad Success. Esto le dará un éxito de IdentityResult.
https://msdn.microsoft.com/en-us/library/microsoft.aspnet.identity.identityresult(v=vs.108).aspx