3

我有以下代码尝试存根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; }
}
4

2 回答 2

6

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

Query<T>,特别是,是一个在内部调用的扩展方法ISession.GetSessionImplementation(),所以你必须模拟它才能使用它(这很重要,实际上将你与特定的实现细节联系在一起)

有两个更好的选择:

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

除非您已经在使用存储库,否则我的建议是使用 #2。

于 2012-06-05T12:30:06.790 回答
0

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

于 2012-06-05T04:36:34.670 回答