在List.AsQuerable

时间:2016-07-27 14:49:21

标签: c# linq unit-testing nhibernate

我正在使用FluentNhibernate开发一些数据库应用程序。

在我的单元测试中,我通过在内存中将普通通用列表作为可共享对象而不是从nhibernate会话实例获取IQuerable来模拟我的所有数据库操作(基本上是LINQ代码)。

//AAA: Arrange, Act, Assert

//arrange
var myObjects = new List<MyObject>();
//add test objects...
var businessLogic = new BusinessLogic(myObjects.AsQueryable);

//act
businessLogic.Execute();

//Assert
Assert.AreEqual(2,myObjects.Count);
Assert.IsTrue(myObjects[0].Modified);
...

有了这个,我几乎可以使用所有的LINQ扩展方法,比如“普通的香草”。一个例子:

public void BusinessLogic.Execute(IQuerable<MyObject> objects)
{
   objectsToProcess = objects.Where(x=>x.ToBeProcessed))
   foreach(var obj on objectsToProcess)
   {
       obj.Modified = true;
   }
}

我的问题:如果要测试的对象使用Nhibernate特定的扩展方法(例如“Fetch”来检索关联的详细信息对象),则在列表实例上执行的模拟查询将失败,并出现以下异常(从德语翻译):

  

System.InvalidOperationException:类型上没有Fetch方法   “NHibernate.Linq.EagerFetchingExtensionMethods”与之匹配   提供的论据。

堆栈追踪:

  System.Linq.EnumerableRewriter.FindMethod(Type type, String name, ReadOnlyCollection^1 args, Type[] typeArgs, BindingFlags flags)
  System.Linq.EnumerableRewriter.VisitMethodCall(MethodCallExpression m)
  System.Linq.Expressions.OldExpressionVisitor.Visit(Expression exp)
  System.Linq.Expressions.OldExpressionVisitor.VisitExpressionList(ReadOnlyCollection^1 original)
  System.Linq.EnumerableRewriter.VisitMethodCall(MethodCallExpression m)
  System.Linq.Expressions.OldExpressionVisitor.Visit(Expression exp)
  System.Linq.EnumerableExecutor^1.Execute()
  System.Linq.EnumerableQuery^1.System.Linq.IQueryProvider.Execute[S](Expression expression)
  System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source)
  ...

我对整个“可查询”主题不太熟悉,所以请原谅任何愚蠢的问题......有没有办法构建一个在List实例上触发时忽略这些命令的存根?因为这个问题只是在运行时引发的,所以有一些反思,我想?

0 个答案:

没有答案