C# 在存根模拟的'ISession'对象时引发异常

C# 在存根模拟的'ISession'对象时引发异常,c#,nhibernate,rhino-mocks,C#,Nhibernate,Rhino Mocks,我在下面的代码中尝试存根ISession.Query() 我做错了什么?我应该如何进行stubingISession.Query() NHibernate 3.3.0.4000 编辑: UnitModelclass: public class UnitModel { public virtual string Name { get; set; } public virtual string Symbol { get; set; } } 在您的UnitModel类中实现ISess

我在下面的代码中尝试存根
ISession.Query()

我做错了什么?我应该如何进行stubing
ISession.Query()

NHibernate 3.3.0.4000

编辑:
UnitModel
class:

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

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

模仿ISession通常代价高昂且痛苦

尤其是
Query
,它是一种在内部调用
ISession.GetSessionImplementation()
的扩展方法,因此您必须模拟它才能使用它(这非常重要,实际上将您与特定的实现细节联系在一起)

有两个更好的选择:

  • 实现一个存储库接口,该接口有一个由NHibernate会话支持的实现,并且可以很容易地进行模拟
    • 优点:功能强大,没有限制
    • 缺点:当您需要访问特定的NH特性时,您可能会发现自己受到自己的抽象或重新发明轮子的限制
  • 使用内存中或干净的数据库进行测试
    • 优点:安装工作量大大减少,您可以访问NH的所有功能
    • 缺点:如果使用不同的DB引擎,某些查询可能会有不同的行为

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

    你能在这里发布你的UnitModel类吗?我尝试使用1,但一路上我意识到我的应用程序中需要很多不同的查询,我的存储库界面开始看起来像
    ISession
    本身。然后我去了2。正如我使用NCrunch一样,即使使用MSSQLServer2005,也几乎没有时间浪费在测试上。
    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();'
    
    public class UnitModel
    {
        public virtual string Name { get; set; }
        public virtual string Symbol { get; set; }
    }