2012-06-05 131 views
3

我有以下代码,我尝试存根ISession.Query<UnitModel>()异常抛出时嘲笑`ISession`对象

var unitList = new List<UnitModel>() 
      { 
       new UnitModel(){Name = "meters", Symbol="m"}, 
       new UnitModel(){Name="grams", Symbol="g"} 
      }; 

MockRepository.GenerateMock<ISession>().Stub(x => x.Query<UnitModel>()).Return(unitList.AsQueryable<UnitModel>()); 

运行时,这将引发异常:

System.InvalidOperationException : Type 'System.Linq.EnumerableQuery`1[[MIB.DomainModels.UnitModel, MIB, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' doesn't match the return type 'NHibernate.Engine.ISessionImplementor' for method 'ISession.GetSessionImplementation();' 

我在做什么错在这里?我应该如何去剔除ISession.Query<UnitModel>()

的NHibernate 3.3.0.4000

编辑: UnitModel类:

public class UnitModel 
{ 
    public virtual string Name { get; set; } 
    public virtual string Symbol { get; set; } 
} 
+0

你可以在这里发布你的UnitModel类吗? – Faraday

回答

6

嘲笑ISession通常是昂贵的和痛苦的。

Query<T>,尤其是调用ISession.GetSessionImplementation()内部,所以你不得不嘲笑与它的工作扩展方法(这是不平凡的,实际上你绑到一个具体的实施细节)

有两个更好的替代品:

  1. 实现具有由NHibernate会话支持一实现仓库接口,可以很容易地嘲笑
    • 优点:功能强大,没有任何限制
    • 缺点:你可能会发现自己被自己的抽象的限制或重新发明轮子,当你需要访问特定的NH特点
  2. 使用的内存或干净的DB测试
    • 优点:更工作设置,您可以访问所有NH功能
    • 缺点:如果您使用不同的数据库引擎,某些查询可能会有不同的行为。

除非你已经在使用存储库,我的建议是去与#2。

+0

我试图去1,但一路上我意识到我需要在我的应用程序中的很多不同的查询,我的存储库接口开始看起来像'ISession'本身。然后我去了2.因为我有NCrunch,即使使用MSSQLServer 2005,测试也几乎没有时间浪费。 – nakiya

0

实现ISessionImplementor在UnitModel类,VisualStudio中应该再警告你缺少的方法。虽然我不知道它因为ISessionImplementor是一个内部接口,我敢肯定你不应该使用!