2010-06-20 56 views
2

我使用NHibernate進行數據訪問。我正在爲我的數據訪問層編寫一些測試,並在特定日期範圍內選擇記錄。NHibernate生成的值和測試

在測試中,我通過在一個範圍內選擇隨機日期來生成測試數據,然後嘗試選擇該範圍內子集內的日期記錄。例如,我生成的日期在昨天和明天之間,然後我只選擇日期爲今天的記錄。

問題是這些日期通常由DB生成 - 它們基本上設置爲generated="insert"。有沒有一種方法來設置NHibernate,使它使用DB生成的日期,當用戶不提供一個日期?

如果沒有,任何人都有在測試過程中減輕這種情況的策略?

回答

0

構建時,將實體上的DateTime屬性初始化爲DateTime.Now。給它一個受保護的setter,並在你的測試代碼中實現一個派生類型,該類型公開了一個設置它的方法。

public class RealEntity 
{ 
    public virtual int Id { get; private set;} 
    ... 
    public virtual DateTime Created { get; protected set; } 
} 

[TestFixture] 
public class SomeTest 
{ 
    ... 

    public class Testable : RealEntity 
    { 
     public void SetCreatedDate(DateTime date) 
     { 
      Created = date; 
     } 
    } 
} 
+0

我發現暴露私有/保護的東西半信半疑。您建議您將測試與正在測試的課程的內部結構相結合。基本上,你測試'Testable'而不是'RealEntity',從而破壞了整個單元測試的想法。 – 2010-08-20 17:46:19

+0

說「它打破了單元測試的整個想法」是極端的。我提出的選項是解決使用nhibernate時遇到的常見問題或任何其他使用代理類(或反射)爲非公共設置者設置屬性的問題的解決方法。根據我的建議,將受測試的類子類化,模擬nhibernate用動態代理所做的事情,以便可以將實例置於一種狀態,就好像它被nhibernate水合,並保持所有其他行爲不變。這是不理想的,我渴望聽到替代品,但它是可行的。 – mattk 2010-08-30 10:32:22