J'essaie de maîtriser l'unité de test d'une application de test ASP.NET MVC très simple que j'ai construite en utilisant l'approche Code First de la dernière version d'EF4 CTP. Je ne suis pas d'expérience très avec tests unitaires/moqueur, etc.Tests unitaires avec EF4 "Code First" et Repository
Ceci est ma classe Repository:
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;
}
}
C'est IWeightTrackerContext
public interface IWeightTrackerContext
{
DbSet<WeightEntry> WeightEntries { get; set; }
int SaveChanges();
}
... et sa mise en œuvre, WeightTrackerContext
public class WeightTrackerContext : DbContext, IWeightTrackerContext
{
public DbSet<WeightEntry> WeightEntries { get; set; }
}
Dans mon test, j'ai ce qui suit:
[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);
}
Et mon 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();
}
}
Mon problème se produit quand je suis en train de construire des données de test que je ne peux pas créer un DbSet<>
car il n'a pas de constructeur. J'ai l'impression d'aboyer le mauvais arbre avec toute mon approche en essayant de me moquer de mon contexte. Tout conseil serait le bienvenu à ce débutant d'essai complet de l'unité.
Merci pour le lien, qui ressemble à un bon article. En ce qui concerne l'implémentation d'un talon de DbSet, dites-vous que mon MockWeightTrackerContext retournera, par exemple, MyDbSetStub au lieu de DbSet? Mais alors cette classe ne mettrait pas en œuvre l'interface. Désolé pour les questions (probablement stupides). ;) – DavidGouge
Merci beaucoup d'avoir pris le temps d'expliquer cela. Ceci et le lien que vous avez fourni ont beaucoup aidé. Si je pouvais rejeter votre réponse à nouveau, je le ferais. : D – DavidGouge
Merci, cet article MSDN implémentant le InMemoryObjectSet était exactement ce dont j'avais besoin pour que mon IContext fonctionne correctement. – kamranicus