Primer post de la serie
Próximo post de la serie
Anterior post de la serie
Desde el anterior post, he aplicado las sugerencias que dejaron en comentarios @MartinSalias y @theHumanFlag, gracias! (las dejaron en el post en inglés). Primero, renombré la clase Genre a Subject, usando las capacidades de refactoring de Visual Studio:
public class Subject { public string Name { get; set; } }Segundo, ahora el controlador recibe y procesa un IEnumerable<Subject>:
public class SubjectController : Controller { private IEnumerable<Subject> subjects; public SubjectController() { } public SubjectController(IEnumerable<Subject> subjects) { this.subjects = subjects; } public ActionResult Index() { return View(subjects); } }Hice los cambios con confianza, gracias a los tests.
Ahora, en este nuevo paso, agregué una acción: dado un Id, obtener el Subject. La propiedad Id agregada en Subjec:
public class Subject { public int Id { get; set; } public string Name { get; set; } }Escribí el test:
[TestMethod] public void GetSubjectForDetail() { IEnumerable<Subject> subjects = new List<Subject>() { new Subject() { Id = 1, Name = "Mathematics" }, new Subject() { Id = 2, Name = "Physics" }, new Subject() { Id = 3, Name = "Biology" }, new Subject() { Id = 4, Name = "Literature" } }; SubjectController controller = new SubjectController(subjects); ActionResult result = controller.Details(1); Assert.IsNotNull(result); Assert.IsInstanceOfType(result, typeof(ViewResult)); ViewResult viewResult = (ViewResult)result; Assert.IsInstanceOfType(viewResult.ViewData.Model, typeof(Subject)); Subject model = (Subject)viewResult.ViewData.Model; Assert.AreEqual(1, model.Id); Assert.AreEqual("Mathematics", model.Name); }El test no compila. Agregué la acción en el controler:
public ActionResult Details(int id) { return View(); }El test compila, pero da en rojo. Vamos por el verde:
public ActionResult Details(int id) { var model = this.subjects.Where(s => s.Id == id).FirstOrDefault(); return View(model); }En este punto, tenía dos tests, que daban una lista de Subjects al controlador. Hice refactoreo de los test para separar la creación de la lista. Extraje el método:
private static IEnumerable<Subject> GetSubjects() { IEnumerable<Subject> subjects = new List<Subject>() { new Subject() { Id = 1, Name = "Mathematics" }, new Subject() { Id = 2, Name = "Physics" }, new Subject() { Id = 3, Name = "Biology" }, new Subject() { Id = 4, Name = "Literature" } }; return subjects; }Ahora, el código del test es:
[TestMethod] public void GetSubjectInDetail() { IEnumerable<Subject> subjects = GetSubjects(); SubjectController controller = new SubjectController(subjects); ActionResult result = controller.Details(1); Assert.IsNotNull(result); Assert.IsInstanceOfType(result, typeof(ViewResult)); ViewResult viewResult = (ViewResult)result; Assert.IsInstanceOfType(viewResult.ViewData.Model, typeof(Subject)); Subject model = (Subject)viewResult.ViewData.Model; Assert.AreEqual(1, model.Id); Assert.AreEqual("Mathematics", model.Name); }Todo en verde!
![]()
Como siempre, el código está en mi AjCodeKatas Google Project, esta vez en trunk/AppTdd/Step02)
Próximos pasos: más acciones, integrar alguna vista.
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez