2010-07-20 3 views
0

J'ai des classes de service basées sur Entity Framework 4. Je voudrais les tester sur une base de données remplie de données pré-générées. Le problème est le suivant: je voudrais que les tests, qu'ils soient réussis ou échoués, ne touchent pas réellement la base de données, afin qu'elle puisse être réutilisée pour d'autres tests. Par conséquent, je voudrais que ObjectContext.SaveChanges prétende que tout va bien et conserve les changements dans la mémoire, mais omet silencieusement leur persistance réelle dans la source de données. Est-ce possible?Est-il possible d'empêcher EF SaveChanges() d'écrire dans DB?

P.S. Je suis conscient du modèle de dépôt, mais je ne voudrais pas l'utiliser dans ce cas.

+0

Pourquoi ne pas même appeler SaveChanges si vous ne testez pas son impact au niveau des données? –

+0

Oui, je viens d'avoir la même idée :-) Peut-être un drapeau passé au constructeur du service peut-être. Dommage que des choses comme DRI ne soient pas testées, mais je me dis qu'il n'y a aucun moyen de les tester sans toucher à la DB. –

Répondre

0

Je vais sortir sur un membre ici avec celui-ci ... Je sais que cela fonctionne avec LINQ to SQL

Vous pouvez remplacer la méthode SaveChanges dans votre contexte/conteneur

et en fait supprimer la base.SaveChanges();

Il ressemble à ceci:

public override int SaveChanges(SaveOptions options){ 
    return base.SaveChanges(); 
} 

donc si vous supprimez cette ligne, vous pouvez l'adapter à votre situation

+0

Merci, va essayer ça. (Ou peut-être simplement suivre la route mentionnée ci-dessus ...) –

+0

Commenting ou en décommentant une ligne pour les tests unitaires me semble une terrible idée ... et si vous oubliez de décommenter l'appel à 'base.SaveChanges' avant d'aller à production ? Vous ne devriez * jamais * modifier le code que vous testez juste pour le tester. Une meilleure idée serait de créer un ObjectContext spécifique pour les tests, où vous écraseriez 'SaveChanges'. Mais même cela n'est pas une bonne solution, car les modifications apportées à 'ObjectContext' ne sont pas visibles dans les requêtes jusqu'à ce que vous appeliez' SaveChanges' –

1

Vous avez juste besoin d'envelopper vos tests dans une transaction que vous ne commettez pas :

using(var context = new MyObjectContext()) 
{ 
    context.Connection.Open(); 
    using (var transaction = context.Connection.BeginTransaction()) 
    { 
     // Your tests here 
     ... 

    } // At this point, the transaction is rolled back, since it hasn't been commited 
}