2010-09-15 11 views
5

Soy relativamente nuevo en el uso de TDD y he estado leyendo sobre burlarse de objetos últimamente. Tengo la siguiente prueba para probar un método que da una fecha devuelve el próximo sábado.Debo usar burlas para el siguiente ejemplo

[TestMethod()] 
     public void NextSaturdayTest() 
     { 
      DateTime date = new DateTime(); 
      date = DateTime.Parse("2010-08-14"); 
      DateTime expected = new DateTime(); 
      expected = DateTime.Parse("2010-08-21"); 
      DateTime actual; 
      actual = DateExtensions.NextSaturday(date); 
      Assert.AreEqual(expected, actual); 

      date = DateTime.Parse("2010-08-19"); 
      expected = DateTime.Parse("2010-08-21"); 
      actual = DateExtensions.NextSaturday(date); 
      Assert.AreEqual(expected, actual); 
     } 

first off, ¿esto representa buenas prácticas de prueba? En segundo lugar, ¿cuál es la ventaja de utilizar un marco simulado para crear esta prueba?

Deseo saber si puedo ofrecer más información.

Gracias por cualquier pensamiento

Respuesta

7

En primer lugar, no hacer esto:

DateTime date = new DateTime(); 
date = DateTime.Parse("2010-08-14"); 

Usted está creando una nueva fecha y hora, y luego tirarlo al analizar una cadena para obtener un nuevo datetime. Recuerde, el código de prueba aún debe ser un buen código.

En segundo lugar, una buena prueba prueba una cosa. Es posible que tenga varias pruebas como ReturnsCorrectNextSaturdayGivenAWednesday, ReturnsCorrectNextSaturdayWhenCrossesEndOfMonth y ReturnsCorrectNextSaturdayWhenCrossesEndOfYear.

Y, por último, no hay ninguna razón para burlarse aquí. Un simulacro sería apropiado si sus extensiones de fecha llamaran a otro componente (digamos una base de datos), y usted quisiera simular esa llamada. Entonces, en lugar de probar DateExtensions + Data Access, solo estarías probando DateExtensions y cuando llamó a la capa de acceso a datos, sería una prueba de que tu prueba se configuró.

5

que imita se utiliza para satisfacer las dependencias.

Por ejemplo. Considere si usted tiene una clase que se carga a los usuarios de una base de datos utilizando un IDataLayer (envoltura alrededor de la base de datos)

Cuando la prueba, que no quieren poner a prueba contra una base de datos. Hace que sea difícil proporcionar datos y verificar el resultado. En cambio, se burla de un objeto IDataLayer para poder proporcionar manualmente un usuario al UserService. Hace que sea mucho más fácil validar que UserService hace lo que se supone que debe hacer.

En cuanto a su método de prueba. Lo dividiría en dos métodos, ya que está ejecutando dos pruebas diferentes (aunque con el mismo método)

2

En este caso, no es necesario un marco de burla y, por lo tanto, no debe utilizarse.

Su prueba es bastante razonable. Yo, personalmente, en línea la mayor parte del análisis de la fecha para una mejor legibilidad:

[TestMethod()] 
    public void NextSaturdayTest() 
    { 
     DateTime actual = DateExtensions.NextSaturday(DateTime.Parse("2010-08-14")); 
     Assert.AreEqual(DateTime.Parse("2010-08-21"), actual); 

     actual = DateExtensions.NextSaturday(DateTime.Parse("2010-08-19")); 
     Assert.AreEqual(DateTime.Parse("2010-08-21"), actual); 
    } 
2

Creo que estás bien sin burla en este caso. Por lo general, se burla de algún tipo de dependencia (por ejemplo, si tiene un DateProvider o algo así), pero en este caso, usar DateTime me parece directamente bueno.

Yo, sin embargo, limpiaré su prueba un poco. Debería seguir probando una cosa por método, porque si ese método falla, sabrá POR QUÉ falló, en lugar de tener que examinar las afirmaciones y preguntarse si el resto de ellas habría pasado.

[TestMethod()] 
public void NextSaturdayReturnsCorrectValueStartingFromASaturday() 
{ 
    DateTime date = DateTime.Parse("2010-08-14"); 

    DateTime expected = DateTime.Parse("2010-08-21"); 
    DateTime actual = DateExtensions.NextSaturday(date); 

    Assert.AreEqual(expected, actual); 
} 

[TestMethod()] 
public void NextSaturdayReturnsCorrectValueWithinTheSameWeek() 
{ 
    DateTime date = DateTime.Parse("2010-08-19"); 
    DateTime expected = DateTime.Parse("2010-08-21"); 
    DateTime actual = DateExtensions.NextSaturday(date); 

    Assert.AreEqual(expected, actual); 
} 

Y como otros sugirieron, continúe ampliando su clase de prueba para incluir controles para algunas de las situaciones más extrañas que pueda encontrar.

Cuestiones relacionadas