我有以下代码,我尝试存根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; }
}
答案 0 :(得分:6)
嘲弄ISession
通常既昂贵又痛苦。
Query<T>
是一种在内部调用ISession.GetSessionImplementation()
的扩展方法,所以你必须嘲笑它才能使用它(这是非常重要的,实际上将你绑定到一个特定的实施细节)
有两种更好的选择:
除非您已经在使用存储库,否则我的建议是使用#2。
答案 1 :(得分:0)
在你的UnitModel类中实现ISessionImplementor,然后VisualStudio会警告你缺少方法......虽然我不确定它会有多大帮助,因为ISessionImplementor是一个内部接口,我很确定你不应该这样做使用!