我正在嘗試爲我的存儲庫編寫集成測試,但我找不到一個很好的方式來斷言結果是我想要的。如何驗證從數據庫中正確提取集合?
我有一個靜態屬性爲我所有的測試數據類 - 項目,用戶等在我的測試安裝,我插入所有這些實體在我的數據庫使用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
,即沒有時區指示符。
通過檢查我可以驗證存儲庫是否真的獲取了正確的元素,所以我的測試顯然是在測試錯誤的東西。
我在這裏做錯了什麼?
關於測試數據層:我嘗試使用'ISession'來模擬微軟鼴鼠,但創建NHibernate.Moles.dll不成功(見[這個問題](http://stackoverflow.com/questions/6580014/cant-generate-nhibernate-moles-dll-build-errors-in-generated )),所以我採用了集成測試(儘管我想這樣做,所以嘲笑NHibernate不能解決這個問題......)。我會看看我是否可以將延遲加載設置爲false,並檢查我的日期時間列數據類型並返回。 –
我現在在這方面做了很多工作,得出如下結論:1)關閉延遲加載解決了代理問題。謝謝! 2)我已經嘗試了SQL Server中所有可用的日期時間類型,並且它們都不起作用。我決定使用的是datetime(主要用於與應用程序的其他部分併發),並且我發現兩個datetime實例具有「.Ticks」完全相同的值,所以它們確實表示相同的點及時。 –