ASP.NET MVC MyTwitter (Parte 2)

Como parte de la serie sobre el desarrollo de una aplicación similar a Twitter para aprender ASP.NET MVC. Voy a seguir con la parte de registro (Signup). Esta semana he estado ocupado con trabajo, por eso agregaré poca funcionalidad en este post, la cual consiste en que una vez que el usuario se registre debemos de iniciar sesión con ese usuario, es decir identificarlo como un usuario Autentificado.

Para ello es necesario escribir una clase (y una Interfaz) que me ayude en esta funcionalidad, para después hacer un mock de ella en el test del AccountController.

namespace MyTwitter.Models
{
public interface IFormsAuthenticationTasks
{
void SetAuthCookie(string username, bool createPersistentCookie);
void SignOut();
}
}
using System.Web.Security;
namespace MyTwitter.Models
{
public class FormsAuthenticationTasks
: MyTwitter.Models.IFormsAuthenticationTasks
{
public void SetAuthCookie(string username,
bool
createPersistentCookie)
{
FormsAuthentication.SetAuthCookie(
username, createPersistentCookie);
}

public void SignOut()
{
FormsAuthentication.SignOut();
}
}
}

agrego una variable de tipo IFormsAuthenticationTasks al AccountController y al constructor usado para las pruebas

public class AccountController : Controller
{
private IUserRepository userRepository;
private IFormsAuthenticationTasks formsAuthenticationTasks;

public AccountController(IUserRepository userRepository,
IFormsAuthenticationTasks formsAuthenticationTasks)
{
this.userRepository = userRepository ?? new UserRepository();
this.formsAuthenticationTasks =
formsAuthenticationTasks ?? new FormsAuthenticationTasks();
}

public AccountController()
: this(null, null)
{
}
...

escribo el test para la nueva funcionalidad

[TestMethod]
public void Login_User_After_Signup()
{
formsAuthenticationMock.Setup(
fa => fa.SetAuthCookie(It.IsAny<string>(), It.IsAny<bool>()));
controller.Signup(null);
formsAuthenticationMock.VerifyAll();
}

implemento la funcionalidad en el método Signup del Account Controller para que la prueba pase, es solo agregar una línea antes del redirect

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Signup(FormCollection formValues)
{
var user = new User();
UpdateModel(user);
userRepository.Add(user);
userRepository.Save();

formsAuthenticationTasks.SetAuthCookie(user.Username, true);

return Redirect("/invitations");
}
Hasta aquí con esta parte. Estuve tentado a llamarla “Parte 1.5” en lugar de “Parte 2”, por el poco contenido, pero se iba a empezar a complicar la numeración, continuaré con la serie en siguientes posts.

Comentarios