2010-11-10 2 views
3

J'essaie d'écrire des tests unitaires pour mon code. Dans out projet, nous utilisons les objets Linq-SQL créés à partir de DBML. J'essaie de comprendre comment je devrais tester la logique suivante.Logique de requête Linq-SQL dans les tests unitaires

Dites par exemple que je dois obtenir le nombre d'enregistrements d'une table en utilisant LINQ. Maintenant, je crois comprendre qu'un test unitaire n'est pas vraiment un test unitaire si vous accédez à la base de données.
Ma requête est également beaucoup plus complexe que cela car la structure de données a des clés Forign qui doivent être maintenues.
Maintenant, le prochain problème est que du fait que nous utilisons l'objet LINQ-SQL, nous n'utilisons pas d'interfaces, donc nous ne pouvons pas vraiment utiliser un cadre moqueur (ou pouvons-nous ????) je voudrais savoir ce que le Le processus consiste à pouvoir tester cette unité.

+0

Jetez un coup d'oeil à cette réponse SO: http://stackoverflow.com/questions/4128640/how-to-remove-unit-of-work-functionality-from-repositories-using-ioc/4132186#4132186 – Steven

Répondre

2

Vous avez besoin d'une classe intermédiaire entre votre DBML et votre code de logique métier pour pouvoir tester. Jetez un oeil au modèle de dépôt pour plus de détails à ce sujet. Permettez-moi de vous donner un exemple très simple, supposons que vous ayez une table de produits et que vous vouliez tester si le nombre total de produits dans votre base de données est inférieur à 10 produits. Vous avez besoin d'une classe de référentiel qui vous fournit le nombre de produits dans la base de données sous forme d'entier, vous ne vous souciez pas de la façon dont la méthode obtient le nombre tant que vous obtenez le nombre (pensez à l'abstraction). Jetez un oeil à l'extrait de code suivant:

public interface IRepository 
{ 
    int CountProduct(); 
} 

// your implementation of repository against real database 
public class DBLinqToSQLRepository : IRepository 
{ 
    // some constructor here 

    public int CountProduct() 
    { 
     // your code here to return the actual number of product from db. 
    } 
} 

// your implementation of fake repository that will provide fake data for testing 
public class FakeRepository : IRepository 
{ 
    private List<Product> products = new List<Product>(); 

    // some initialization here 

    public int CountProduct() 
    { 
     return products.Count; 
    } 
} 

Ensuite, dans votre environnement de test, vous pouvez utiliser ce FakeRepository au lieu du référentiel de base de données réelle pour tester votre logique métier.

1

Vous pouvez encapsuler ce code dans une classe Repository qui peut avoir la méthode suivante, par ex.

public int GetNumberOfItemsAddedToday() 
{ 
    return from x in DB.MyRecords 
      where x.DateAdded.Date == DateTime.Now.Date 
      select x).Count(); 
} 

Je vous recommande d'utiliser une interface pour le dépôt, afin que vous puissiez se moquer de la garde (en utilisant quelque chose comme Moq, RhinoMocks). This blog post a un bon tutoriel sur la création d'un référentiel pour le code LINQ To SQL, mais il existe de nombreux exemples sur le web et SO sur la façon de le faire aussi.

Vous pouvez ensuite tester l'unité le code ci-dessus

Lorsque vous écrivez des tests unitaires qui interagissent avec la base de données, les ont tendance à être appelé integration tests.