unitarias unit test pruebas net asp c# asp.net-identity rhino-mocks

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!



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;