Comment les gens testent-ils unitairement le code qui utilise Linq to SQL ?
Réponses
Trop de publicités?Mise à jour :
Fredrik a mis en ligne sur son blog un exemple de test unitaire des applications linq2sql. Vous pouvez le télécharger à l'adresse suivante :
Je trouve non seulement génial qu'il ait publié un exemple de solution, mais il a également réussi à extraire des interfaces pour toutes les classes, ce qui rend la conception plus découplée.
Mon ancien poste :
*J'ai trouvé ces blogs qui, selon moi, constituent un bon point de départ pour la réalisation du wrapper DataContext : Lien1 Lien2
Ils couvrent presque le même sujet, sauf que le premier met en œuvre des moyens pour extraire des interfaces pour les tables également. La seconde est plus complète, c'est pourquoi je l'ai incluse également.*
3 ans de retard, mais c'est comme ça que je fais :
https://github.com/lukesampson/LinqToSQL-test-extensions/
Pas besoin d'écrire un wrapper ou de faire beaucoup de plomberie, il suffit de déposer le modèle T4 à côté de votre .dbml et vous obtenez :
- Une interface pour votre contexte de données, par exemple IExampleDataContext.
- Une copie en mémoire de votre contexte de données, par exemple MemoryExampleDataContext.
Les deux utiliseront automatiquement les mappings que vous avez déjà configurés dans votre DBML.
Vous pouvez donc faire des choses comme
public class ProductRepo {
IExampleDataContext DB { get; set };
public ProductRepo(IExampleDataContext db) {
DB = db;
}
public List<Product> GetProducts() {
return DB.Products.ToList();
}
}
et vous pouvez l'appeler soit avec
new ProductRepo(new MemoryExampleDataContext()).GetProducts(); // for testing
ou
new ProductRepo(new ExampleDataContext()).GetProducts(); // use the real DB
Enveloppez le DataContext, puis simulez le wrapper. C'est le moyen le plus rapide de le faire, bien que cela nécessite de coder pour les tests, ce que certaines personnes pensent que cela sent mauvais. Mais parfois, lorsque vous avez des dépendances qui ne peuvent pas être (facilement) simulées, c'est le seul moyen.
Mattwar sur le site Le journal Web du voyageur a publié un excellent article sur la façon de créer un contexte de données Linq2Sql extensible. Consultez-le -- MOCKS NIX - UN CONTEXTE DE DONNÉES LINQ TO SQL EXTENSIBLE