我在服务层的接口上有以下两种方法:
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,你怎么知道事情仍然有效?我会有一个单元测试来测试升序和一个测试降序.