Angel "Java" Lopez

NET, Java, PHP y Desarrollo de Software

This Blog

Syndication

Search

Tags

Community

Email Notifications

Archives

.NET

ASP.NET

Windows Form

VB.NET

C#

Sitios

Blogs

Escribiendo una Aplicación usando TDD (Parte 3) Primer Detalle

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

Published Thu, Mar 31 2011 10:55 by lopez

Comments

# Escribiendo una Aplicación usando TDD (Parte 4) Alta y Actualización@ Thursday, June 02, 2011 5:05 AM

Anterior Post Siguiente Post En el anterior post, implementé la recuperación de los datos de un Tema

Angel "Java" Lopez

Leave a Comment

(required) 
(required) 
(optional)
(required) 
If you can't read this number refresh your screen
Enter the numbers above: