如何验证Linq2Object作为Linq2Entity查询?

时间:2013-10-11 09:32:24

标签: c# unit-testing entity-framework-4.1

我需要IObjectSet<T>的实现才能验证表达式作为“真正的”Linq2Entity提供程序。有可能吗?

背景
我已经更改了我的EF模型(模型优先)以返回IObjectSet<T>而不是ObjectSet<T>为了我可以伪造我的模型,并让它返回我想要的数据。

问题
我编写了IObejctSet<T>的实现,它实际上是List<T>的包装器 当我使用LinqToObject查询IObjectSet<T> im的实现时,这一切都很好 - - 因此无法保证我有有效的 Linq2Entity表达式。

建议的解决方案
用真实的 在我的实现中,我只使用List<T>的提供者:

private class IObjectSetUnitTestImplementation<T> : IObjectSet<T> where T : EntityObject
{
  private IQueryable _qry;

  public IObjectSetUnitTestImplementation(List<T> lst)
  {
    _inner = lst;
    _qry = _inner.AsQueryable();
    Expression = _qry.Expression;
    ElementType = _qry.ElementType;
    Provider = _qry.Provider; //<--should be ObjectSet<T>'s provider
  }
  //Rest of implementaion omitted
}

所以我尝试了这个:

ObjectContext context = null;
var _qry = new ObjectQuery<T>(typeof(T).Name, context) as IQueryable;
Expression = _qry.Expression;
ElementType = _qry.ElementType;
Provider = _qry.Provider;

但我没有上下文来提供它,即使我有,它只会尝试访问数据库。

还有其他办法吗?

1 个答案:

答案 0 :(得分:1)

  

因此无法保证我有有效的Linq2Entity表达式&#34;

恭喜,您刚刚发现了一个原因,为IObjectSet<T>实施IRepository<T>IQyeryable<T>等原因。原因很简单:对一个LINQ提供程序有效的查询对另一个LINQ提供程序可能无效(即使您只是将数据库从MS SQL更改为其他提供者)。

并且没有通用的方法来验证这些查询 因此,单元测试不是IQyeryable<T>的不错选择,但集成测试绝对是您需要的。