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