Vous rencontrerez un problème de test unitaire avec CE4 si votre modèle possède des clés générées par la base de données (généralement spécifiées dans EF4 avec l'annotation [DatabaseGenerated (DatabaseGeneratedOption.Identity)], car CE4 ne le prend pas en charge.
Mais j'ai trouvé une solution de contournement facile sans avoir besoin de modifier mon code de production (qui s'exécute sur SQL 2008). J'ai créé une sous-classe proxy de mon DbContext, et il l'emportaient sur OnModelCreating
pour supprimer l'annotation et l'emportaient sur SaveChanges
pour définir l'ID manuellement:
public class TestContext : MyDbContext
{
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MyEntity>().Property(e => e.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
base.OnModelCreating(modelBuilder);
}
public override int SaveChanges()
{
foreach (var entry in ChangeTracker.Entries<MyEntity>().Where(e => e.State == EntityState.Added))
{
entry.Entity.Id = Guid.NewGuid();
}
return base.SaveChanges();
}
}
Avec ces modifications mineures, je peux maintenant test unitaire le même référentiel code dans CE4 qui s'exécute sous SQL 2008 en production.
Et si vous utilisez ID d'entiers plutôt que GUIDs, il y a une belle méthode d'extension ici qui peut être branché directement dans la solution ci-dessus: http://enigmadomain.wordpress.com/2010/01/06/sql-compact-identity-columns-and-entity-framework/
double possible de [Test EF application SQL Server avec SQLite en mémoire ?] (http://stackoverflow.com/questions/2372030/testing-ef-sql-server-based-application-with-in-memory-sqlite) –
@Craig Stuntz - Je ne cherche pas à me moquer de mes dépôts, que je peux faire maintenant sans problème, je cherche à substituer un DB en mémoire pour un vrai ... de sorte que je peux non seulement tester les services mais je peux tester le code qui génère les tables de DB et insère le défaut les données dans la base de données. –
Pour les personnes qui lisent cette question, SQLite prend désormais en charge .NET 4 et .NET 4.5 via ce site Web: http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki –