Estoy intentando controlar las pruebas de Unit una muy sencilla aplicación de prueba ASP.NET MVC que he creado usando el enfoque Code First en el último EF4 CTP. No soy muy experiencia con pruebas unitarias/burlarse etc.Pruebas unitarias con EF4 "Code First" y Repository
Ésta es mi clase de repositorio:
public class WeightTrackerRepository
{
public WeightTrackerRepository()
{
_context = new WeightTrackerContext();
}
public WeightTrackerRepository(IWeightTrackerContext context)
{
_context = context;
}
IWeightTrackerContext _context;
public List<WeightEntry> GetAllWeightEntries()
{
return _context.WeightEntries.ToList();
}
public WeightEntry AddWeightEntry(WeightEntry entry)
{
_context.WeightEntries.Add(entry);
_context.SaveChanges();
return entry;
}
}
Ésta es IWeightTrackerContext
public interface IWeightTrackerContext
{
DbSet<WeightEntry> WeightEntries { get; set; }
int SaveChanges();
}
... y su aplicación, WeightTrackerContext
public class WeightTrackerContext : DbContext, IWeightTrackerContext
{
public DbSet<WeightEntry> WeightEntries { get; set; }
}
En mi prueba, tengo lo siguiente:
[TestMethod]
public void Get_All_Weight_Entries_Returns_All_Weight_Entries()
{
// Arrange
WeightTrackerRepository repos = new WeightTrackerRepository(new MockWeightTrackerContext());
// Act
List<WeightEntry> entries = repos.GetAllWeightEntries();
// Assert
Assert.AreEqual(5, entries.Count);
}
Y mi MockWeightTrackerContext:
class MockWeightTrackerContext : IWeightTrackerContext
{
public MockWeightTrackerContext()
{
WeightEntries = new DbSet<WeightEntry>();
WeightEntries.Add(new WeightEntry() { Date = DateTime.Parse("01/06/2010"), Id = 1, WeightInGrams = 11200 });
WeightEntries.Add(new WeightEntry() { Date = DateTime.Parse("08/06/2010"), Id = 2, WeightInGrams = 11150 });
WeightEntries.Add(new WeightEntry() { Date = DateTime.Parse("15/06/2010"), Id = 3, WeightInGrams = 11120 });
WeightEntries.Add(new WeightEntry() { Date = DateTime.Parse("22/06/2010"), Id = 4, WeightInGrams = 11100 });
WeightEntries.Add(new WeightEntry() { Date = DateTime.Parse("29/06/2010"), Id = 5, WeightInGrams = 11080 });
}
public DbSet<WeightEntry> WeightEntries { get;set; }
public int SaveChanges()
{
throw new NotImplementedException();
}
}
Mi problema se produce cuando estoy tratando de construir algunos datos de prueba ya que no puedo crear un DbSet<>
ya que no tiene constructor. Me da la sensación de que estoy ladrando al árbol equivocado con todo mi enfoque tratando de burlarme de mi contexto. Cualquier consejo sería bienvenido a este novato de pruebas unitarias completas.
Gracias por el enlace, que se ve un gran artículo. Con respecto a la implementación de un stub de DbSet, ¿está diciendo que mi MockWeightTrackerContext devolvería, digamos, MyDbSetStub en lugar de DbSet? Pero esa clase no implementaría la interfaz. Perdón por las preguntas (probablemente tontas). ;) – DavidGouge
Muchas gracias por tomarse el tiempo para explicar esto. Este y el enlace que proporcionó han ayudado mucho. Si pudiera votar su respuesta nuevamente, lo haría. : D – DavidGouge
Gracias, ese artículo de MSDN que implementó InMemoryObjectSet fue justo lo que necesito para que mi IContext funcione correctamente. – kamranicus