2012-06-05 130 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是一個內部接口,我敢肯定你不應該使用!