.net – 如果使用LINQ For Queries,我们是否需要进行单元测试排序?

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

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的GT;是我实现的通用类,提供流畅的订购.

所以,这就是说 – 我有第一个方法的许多单元测试(确保返回集合,确保为空集合返回null,确保正确过滤,确保返回最大行等).

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

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

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

几个(可能很重要)点:

>这是服务层上的方法,它使用Entity Framework 4.0实现在存储库上检索IQueryable
>对于我的单元测试,服务层注入(通过StructureMap)一个模拟存储库,但是当我想进行集成测试时,我也会手动将其切换到真实存储库

指导/最佳实践将受到高度赞赏.

谢谢!

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

点赞