2011-07-05 60 views
0

我正在嘗試爲我的存儲庫編寫集成測試,但我找不到一個很好的方式來斷言結果是我想要的。如何驗證從數據庫中正確提取集合?

我有一個靜態屬性爲我所有的測試數據類 - 項目,用戶等在我的測試安裝,我插入所有這些實體在我的數據庫使用NHibernate(我已經能夠驗證這作品 - 記錄在那裏,因爲他們應該在設置完成後)。

我的倉庫(略簡體)做到這一點:

public IEnumerable<MyEntity> GetEntitiesByProjectID(id) 
{ 
    return session.Linq<MyEntity>().Where(e => e.Project.ID == id).ToList(); 
} 

在我的測試中,我嘗試斷言結果如下面的代碼示例是正確的,但集合是不等價的幾個原因 - 引用其他實體的主要代碼被城堡代理(Castle.Proxies.UserProxy而不是User)取代。

Assert.AreElementsEqualIgnoreOrder(
    Data.MyEntites.Where(e => e.Project.ID == 1), results) 

還有一些其他的古怪太 - 例如日期時間的表示方式。在我的.NET類型中,日期時間字符串表示是2011-07-05T14:28:11.5655935+02:00,而來自db的是2011-07-05T14:28:11.0000000,即沒有時區指示符。

通過檢查我可以驗證存儲庫是否真的獲取了正確的元素,所以我的測試顯然是在測試錯誤的東西。

我在這裏做錯了什麼?

回答

0

你確定你不得不測試數據層嗎?我相信NHIbernate已經過很好的測試,你必須測試你的服務層併爲數據提供模擬。

如果不是這種情況,請在集成測試期間將延遲加載設置爲false,它應該有助於解決UserProxy而不是User問題。 對於日期時間問題,請檢查數據庫中有哪些數據類型有一列,有:datetime,datetime2,date ...檢查列支持時區

+0

關於測試數據層:我嘗試使用'ISession'來模擬微軟鼴鼠,但創建NHibernate.Moles.dll不成功(見[這個問題](http://stackoverflow.com/questions/6580014/cant-generate-nhibernate-moles-dll-build-errors-in-generated )),所以我採用了集成測試(儘管我想這樣做,所以嘲笑NHibernate不能解決這個問題......)。我會看看我是否可以將延遲加載設置爲false,並檢查我的日期時間列數據類型並返回。 –

+0

我現在在這方面做了很多工作,得出如下結論:1)關閉延遲加載解決了代理問題。謝謝! 2)我已經嘗試了SQL Server中所有可用的日期時間類型,並且它們都不起作用。我決定使用的是datetime(主要用於與應用程序的其他部分併發),並且我發現兩個datetime實例具有「.Ticks」完全相同的值,所以它們確實表示相同的點及時。 –

相關問題