2010-10-01 9 views
4

J'ai les deux méthodes suivantes sur une interface pour ma couche de service:Si vous utilisez LINQ For Queries, devons-nous effectuer un tri par unité de test?

ICollection<T> FindAll<T>(Expression<Func<T, bool>> predicate) where T : Post; 
ICollection<T> FindAll<T,TKey>(Expression<Func<T, bool>> predicate, OrderingOptions<T,TKey> orderingOptions) where T : Post; 

Ils sont très similaires.

La première (essentiellement) Est-ce que:

return repository 
    .Find() 
    .OfType<T>() 
    .Where(predicate) 
    .Take(maxRows) 
    .ToList(); 

Le second (essentiellement) Est-ce que:

return repository 
    .Find() 
    .OfType<T>() 
    .Where(predicate) 
    .WithOrdering(orderingOptions) 
    .Take(maxRows) 
    .ToList(); 

WithOrdering est une méthode d'extension de tuyau i créé:

public static IOrderedQueryable<T> WithOrdering<T,TKey>(this IQueryable<T> source, OrderingOptions<T,TKey> postOrderingOptions) 
     { 
      return postOrderingOptions.SortAscending 
         ? source.OrderBy(postOrderingOptions.OrderingKey) 
         : source.OrderByDescending(postOrderingOptions.OrderingKey); 

     } 

OrderingOptions<T,TKey> est une classe générique i mis en œuvre pour fournir o fluent frotter. Donc, cela étant dit - j'ai de nombreux tests unitaires pour la première méthode (s'assurer que la collection est retournée, s'assurer que la valeur null est retournée pour une collection vide, s'assurer que le filtre est correctement filtré, etc. Mais ma question est - comment puis-je tester la deuxième méthode? Ai-je besoin de deux? Étant donné que la seule chose qui est différente est que im en utilisant les méthodes .OrderBy (ou .OrderByDescending).

Si je suis en train de tester cela, est-ce que je teste simplement le framework LINQ?

Sinon, comment puis-je même tester cela?

Couple de (peut-être important) points:

  1. Ce sont des méthodes sur une couche de service , qui extraient des années IQueryable sur un dépôt , qui est mis en œuvre avec Entity Framework 4.0
  2. Pour mon unité -tests, la couche de service est injectée (via StructureMap) dans un référentiel simulé, mais je le bascule également manuellement vers le référentiel manuellement lorsque je veux faire des tests d'intégration

Des conseils/bonnes pratiques seraient grandement appréciés.

Merci!

Répondre

2

Vous devez tester la deuxième méthode pour vous assurer qu'elle fonctionne. Si vous refactorisez quelque chose qui change son fonctionnement et corrige le premier, comment saurez-vous si vous avez oublié de réparer le second? Si vous refactoriez WithOrdering, comment saurez-vous que les choses fonctionnent encore? J'aurais un test unitaire pour tester ascendant et un test pour descendre.

+0

D'accord. Mais comment puis-je tester cette unité? Devrai-je (par exemple) saisir 3 éléments dont je connais la date (en utilisant une méthode pour obtenir un seul élément), puis saisir 3 éléments classés par date (en utilisant la seconde méthode) et comparer les valeurs manuellement? (c'est-à-dire les éléments de liste ordonnée [0] .date == firstItem.date?) – RPM1984

+0

RPM1984: Vous pouvez récupérer 3 éléments et 'Assert (items [0] .date <= items [1] .date && items [1] .date <= items [2] .date) 'pour ascendant et' Assert (items [0] .date> = items [1] .date && items [1] .date> = items [2] .date) 'pour descendre. – Gabe

+0

Oui, c'est ce que je pensais. D'accord, applaudissements.+1, mais je vais laisser la question ouverte un peu (juste pour que je puisse voir les pensées des autres). Merci. – RPM1984