如果使用LINQ For Queries,我们需要进行单元测试排序吗?

时间:2010-10-01 02:53:27

标签: .net linq unit-testing mstest sql-order-by

我的服务层接口有以下两种方法:

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;

他们非常相似。

第一个(基本上)这样做:

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

第二个(基本上)这样做:

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

WithOrdering是我创建的管道扩展方法:

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>是我实现的通用类,用于提供流畅的排序。

所以,据说 - 我对第一个方法进行了大量的单元测试(确保返回集合,确保为空集合返回null,确保正确过滤,确保返回最多行等)。

但我的问题是 - 如何测试第二种方法?我需要两个吗?鉴于唯一不同的是我使用.OrderBy(或.OrderByDescending)方法。

如果即时测试,我只是测试LINQ框架吗?

如果没有,我怎么能测试这个?

几点(可能很重要)要点:

  1. 这是服务层上的方法,用于检索存储库上的IQueryable,它是使用Entity Framework 4.0实现的
  2. 对于我的单元测试,服务层被注入(通过StructureMap)一个模拟存储库,但我也想手动将其切换到真实存储库做集成测试
  3. 指导/最佳实践将受到高度赞赏。

    谢谢!

1 个答案:

答案 0 :(得分:2)

您需要对第二种方法进行单元测试,以确保其正常工作。如果你重构改变它的工作方式并修复第一个的东西,你怎么知道你是否忘了修复第二个?如果你重构WithOrdering,你怎么知道事情仍然有效?我会有一个单元测试来测试升序,一个测试下降。