当存根模拟“ISession”对象时抛出异常

时间:2012-06-05 04:07:11

标签: c# nhibernate rhino-mocks

我有以下代码,我尝试存根ISession.Query<UnitModel>()

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; }
}

2 个答案:

答案 0 :(得分:6)

嘲弄ISession通常既昂贵又痛苦。

特别是

Query<T>是一种在内部调用ISession.GetSessionImplementation()的扩展方法,所以你必须嘲笑它​​才能使用它(这是非常重要的,实际上将你绑定到一个特定的实施细节)

有两种更好的选择:

  1. 实现一个存储库接口,该接口具有由NHibernate会话支持的实现,并且可以轻松地进行模拟
    • 优点:强大,没有限制
    • 缺点:当您需要访问特定的NH功能时,您可能会发现自己受到自己的抽象限制或重新发明轮子
  2. 使用内存或干净的数据库进行测试
    • 优点:设置工作少得多,您可以访问所有NH功能
    • 缺点:如果您使用其他数据库引擎,则某些查询可能会有不同的行为。
  3. 除非您已经在使用存储库,否则我的建议是使用#2。

答案 1 :(得分:0)

在你的UnitModel类中实现ISessionImplementor,然后VisualStudio会警告你缺少方法......虽然我不确定它会有多大帮助,因为ISessionImplementor是一个内部接口,我很确定你不应该这样做使用!